如何将函数作为参数传递给Java中的Callable

San*_*u C 1 java callable

我有一个函数,使一些服务调用数据库,我不想改变.但是如果有多个请求需要运行此函数,我想在线程池中运行它们.所以,我试图找出如何在Callable类中包装此函数.这是函数的签名:

void invokeCommand(string table, int ctype)

函数invokeCommand不返回任何值,但可以抛出异常.我想使用以下构造不是一个选项,因为我无法将参数和invokeCommand函数传递给它.

Callable<Void> myCommand = new Callable<Void>() {
    public Void call() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我了解到另一种方法是定义一个命名类而不是匿名类,并通过构造函数传递参数(string,int).有没有办法我也可以传递函数invokeCommand?推荐的方法是什么?提前致谢.

use*_*751 9

匿名类可以访问final在它们之外声明的变量.他们还可以访问封闭类的成员变量.

final String table = ...;
final int ctype = ...;
Callable<Void> myCommand = new Callable<Void>() {
    public Void call() {
        invokeCommand(table, ctype);
        return null;
    }
};
Run Code Online (Sandbox Code Playgroud)

在Java 8中,放宽了这个限制 - 不需要声明变量final,但它必须是有效的最终变量.如果变量在声明之后从未被赋值,则该变量实际上是最终的.