可运行的未来接口定义(jdk)

时间:2012-09-03 22:51:34

标签: java interface runnable future

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

RunnableFuture的run()方法的定义:

  

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

然而,这显然不可能总是如此,因为run()的返回类型是void,而RunnableFuture只是一个接口,似乎如果我们要保证这一点,我们就必须知道一些东西关于实现类的性质(例如,get()实现)。

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

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

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

  

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

因此,即使Runnable没有定义任何实现 - 接口告诉我们JVM如何通过Runnable接口实现线程,而不必在实现类上强加非gauranteed合同。

所以我有3个问题:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

RunnableFuture的合同由FutureTask执行。创建FutureTask时,您需要提供CallableRunnable以及值。 run的{​​{1}}方法类似于:

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中,并进行一些额外的检查以确保Callable在调用FutureTask之前处于正确的状态