我对RunnableFuture接口定义的“正确性”有疑问。这可能是关于在java中定义接口注释的正确争用的问题。
RunnableFuture的run()方法的定义:
将此Future设置为其计算结果......
然而,这显然不可能总是如此,因为run()的返回类型是void
,而RunnableFuture只是一个接口,似乎如果我们要保证这一点,我们就必须知道一些东西关于实现类的性质(例如,get()实现)。
现在,如果RunnableFuture实际上返回了一个值,该值是隐藏的并且总是由一个阻塞的get()函数返回,这样的定义(由于它的实现,它必须出现在类而不是接口中)限制),显然是合适的。
因此,我想知道:这个接口的run()方法是否正确定义?
作为一个反例:Runnable run()接口定义始终是正确的。
当使用实现接口Runnable的对象创建一个 线程,启动线程导致对象的run方法 在单独执行的线程中调用。
因此,即使Runnable没有定义任何实现 - 接口告诉我们JVM如何通过Runnable接口实现线程,而不必在实现类上强加非gauranteed合同。
所以我有3个问题:
RunnableFuture的文档在几种情况下是否可能不正确?
如果是(1),是否可以通过java约定接受?
RunnableFuture run()和Runnable run()之间的“真正”区别是什么?
请参阅http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html
答案 0 :(得分:1)
RunnableFuture
的合同由FutureTask
执行。创建FutureTask
时,您需要提供Callable
或Runnable
以及值。 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
之前处于正确的状态