为什么Runnable.run()方法不返回任何输出

时间:2013-01-02 11:08:35

标签: java multithreading

我试图理解为什么Runnable.run方法不作为输入而返回任何东西作为输出?

我知道线程的局部变量(引用或原语)必须来自自己的堆栈,但系统可能已经初始化了。换句话说,我不认为这在技术上是不可能的(但我可能是错的)。

4 个答案:

答案 0 :(得分:7)

返回一些内容很有用,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不需要接受任何参数,因为它是一个可以容纳任意数量字段的对象。 e.g。

 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是一个对象而不仅仅是方法的持有者而无可置疑地传递。

答案 1 :(得分:6)

Runnable就是这样的,你可能正在寻找的是Callable,而它确实通过call()方法返回一个值。你不能将参数传递给Runnable是不正确的:它只取决于你对接口的实现。同样适用于Callable

Java有很多工具可以使Callable异步运行:请参阅ExecutorService。并阅读this了解全貌。

答案 2 :(得分:4)

Runnable的合同使其成为一个完美的原材料,其中构建了更高级别的抽象。这是关注点分离原则的一个很好的例子。

Runnable的主要设计目标是表示新执行线程的入口点。它不代表函数甚至计算:只是在另一个线程上运行的代码。考虑到这一点,void run()方法签名非常有意义。如果它接受了参数,那只会给你想传递参数的许多用例带来负担。

void返回值的情况更加清晰:一旦启动一个线程,它就没有人可以报告,所以返回值的概念只是一个固定点。

答案 3 :(得分:3)

你想要什么?

实际上,可以使用构造函数初始化实现Runnable的类,这使您可以绝对自由地执行任何操作。初始化。至于不返回任何内容,总会有Callable接口,允许返回值。

也许您应该考虑这些与void和非void方法的接口等价物: - )

干杯,