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

时间:2015-01-22 21:34:36

标签: java callable

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

void invokeCommand(string table, int ctype)

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

Callable<Void> myCommand = new Callable<Void>() {
    public Void call() {
        ...
    }
}

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

1 个答案:

答案 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,但它必须是有效的最终。如果变量在声明后从未被赋值,则该变量实际上是最终的。