2

我对 RunnableFuture 接口定义的“正确性”有疑问。这可能是关于在 java 中定义接口注释的正确争用的问题。

RunnableFuture 的 run() 方法的定义:

将此 Future 设置为其计算结果...

然而,这显然不可能总是正确的,因为 run() 的返回类型是void,而 RunnableFuture 只是一个接口,看来如果我们要保证这一点,我们必须了解实现类的性质( get() 实现,例如)。

现在,如果 RunnableFuture 实际上返回了一个值,该值是隐藏的,并且总是由阻​​塞的 get() 函数返回,这样的定义(由于其实现限制,它必须出现在类中,而不是接口中),显然是合适的。

因此,我想知道:此接口的 run() 方法是否正确定义?

作为一个反例:Runnable run() 接口定义总是正确的。

当使用实现接口 Runnable 的对象创建线程时,启动线程会导致在该单独执行的线程中调用对象的 run 方法。

因此,即使 Runnable 没有定义实现——该接口告诉我们 JVM 如何通过 Runnable 接口实现线程,而无需对实现类强加非保证契约。

所以我有3个问题:

  1. RunnableFuture 的文档在几种情况下是否可能不正确?

  2. 如果 (1) 是这种情况,是否可以通过 java 约定接受?

  3. RunnableFuture run() 和 Runnable run() 之间的“真正”区别是什么?

请参阅http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html

4

1 回答 1

1

的合同由RunnableFuture执行FutureTask。创建 aFutureTask时,您提供 aCallable或 aRunnable和一个值。的run方法FutureTask看起来像:

public void run() {
    V result;
    try {
        if(callable) {
            result = callable.call();
        } else {
            runnable.run();
            result = value;
        }
    } catch (Throwable t) {
        setException(t);
        return;
    }
    set(result);
}

除了实际实现将Runnable-value 对包装在 aCallable中并进行一些额外检查以确保在调用FutureTask之前处于正确状态。run

于 2012-09-03T22:58:43.387 回答