我试图理解为什么Runnable.run
方法不接受任何输入并且不返回任何输出?
我知道线程的局部变量(引用或原语)必须来自自己的堆栈,但系统可能已被初始化。换句话说,我不认为这在技术上是不可能的(但我可能错了)。
我试图理解为什么Runnable.run
方法不接受任何输入并且不返回任何输出?
我知道线程的局部变量(引用或原语)必须来自自己的堆栈,但系统可能已被初始化。换句话说,我不认为这在技术上是不可能的(但我可能错了)。
返回一些东西很有用,并且受 Callable 支持,它可以返回一个对象。
Future<MyReturnType> ret = executor.submit(new Callable<MyReturnType>() {
public MyReturnType call() throws Exception {
// do something
return new MyReturnType(value1, value2 ...);
}
});
如您所见,Callable 可以返回一个值,因为 ExecutorService 支持将值传递回带有 Future 对象的线程。这只是在 Java 5.0 中添加的,因此在此之前Runnable
返回一个值不会有用,因为这个返回值没有去哪里。
Runnable 不需要任何参数,因为它是一个可以包含任意数量字段的对象。例如
static void bgLog(final Level level, final String message, final Throwable t) {
logExec.submit(new Runnable() {
// the anonymous nested class implicitly holds a copy of the final arguments above.
public void run() {
LOG.log(level, message, t);
}
});
}
正如你所看到的,run() 方法可以使用任意数量的值,这些值是由于 Runnable 是一个对象,而不仅仅是一个方法的持有者这一事实而隐式传递的。
ARunnable
本来就是这样,您可能正在寻找的是 aCallable
相反,它确实通过其call()
方法返回一个值。您不能将参数传递给 a 是不正确的Runnable
:它仅取决于您对接口的实现。也一样Callable
。
Java 也有很多工具可以让Callable
s 异步运行:请参阅ExecutorService
. 并阅读此完整图片。
的契约Runnable
使它成为构建更高层次抽象的完美原材料。这是关注点分离原则的一个很好的例子。
Runnable
的主要设计目标是代表新执行线程的入口点。它不代表函数甚至计算:只是在另一个线程上运行的代码。考虑到这一点,void run()
方法签名非常有意义。如果它接受参数,那只会增加您不想传递参数的许多用例的负担。
void 返回值的情况更清楚:一旦线程启动,它就没有人可以报告,所以返回值的概念只是一个附加值。