我有一个函数可以对数据库进行一些服务调用,我不想改变它。但是如果有多个请求需要运行此函数,我想在线程池中运行它们。所以,我试图弄清楚如何在Callable类中包装此函数。这是函数的签名:
void invokeCommand(string table, int ctype)
函数invokeCommand不返回任何值但可以抛出异常。我想使用以下构造不是一个选项,因为我无法将参数和invokeCommand函数传递给它。
Callable<Void> myCommand = new Callable<Void>() {
public Void call() {
...
}
}
我了解到另一种方法是定义一个命名类而不是匿名类,并通过构造函数传递参数(string,int)。有没有办法我也可以传递函数invokeCommand?推荐的方法是什么?提前致谢。
答案 0 :(得分:8)
匿名类可以访问在它们之外声明的final
个变量。他们还可以访问封闭类的成员变量。
final String table = ...;
final int ctype = ...;
Callable<Void> myCommand = new Callable<Void>() {
public Void call() {
invokeCommand(table, ctype);
return null;
}
};
在Java 8中,这个限制被放宽了 - 变量不需要声明final
,但它必须是有效的最终。如果变量在声明后从未被赋值,则该变量实际上是最终的。