0

我试图理解为什么Runnable.run方法不接受任何输入并且不返回任何输出?

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

4

4 回答 4

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 不需要任何参数,因为它是一个可以包含任意数量字段的对象。例如

 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 是一个对象,而不仅仅是一个方法的持有者这一事实而隐式传递的。

于 2013-01-02T11:11:28.533 回答
6

ARunnable本来就是这样,您可能正在寻找的是 aCallable相反,它确实通过其call()方法返回一个值。您不能将参数传递给 a 是不正确的Runnable:它仅取决于您对接口的实现。也一样Callable

Java 也有很多工具可以让Callables 异步运行:请参阅ExecutorService. 并阅读完整图片。

于 2013-01-02T11:11:22.247 回答
4

的契约Runnable使它成为构建更高层次抽象的完美原材料。这是关注点分离原则的一个很好的例子。

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

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

于 2013-01-02T11:11:36.560 回答
3

你会喜欢什么?

实际上,实现类Runnable可以使用构造函数进行初始化,这使您可以绝对自由地做任何事情。初始化。至于不返回任何东西,总是有Callable允许返回值的接口。

也许您应该将这些视为 void 和非 void 方法的接口等价物:-)

干杯,

于 2013-01-02T11:12:54.490 回答