Java 可运行的未来接口定义(jdk)
我对RunnableFuture接口定义的“正确性”有一个疑问。这可能是关于在java中定义接口注释的正确争用的问题 RunnableFuture的run()方法的定义: 将此未来设置为其计算结果 然而,这显然不可能总是正确的,因为run()的返回类型是Java 可运行的未来接口定义(jdk),java,interface,runnable,future,Java,Interface,Runnable,Future,我对RunnableFuture接口定义的“正确性”有一个疑问。这可能是关于在java中定义接口注释的正确争用的问题 RunnableFuture的run()方法的定义: 将此未来设置为其计算结果 然而,这显然不可能总是正确的,因为run()的返回类型是void,而RunnableFuture只是一个接口,似乎如果我们要了解这一点,就必须了解实现类的性质(例如get()实现) 现在,如果RunnableFuture实际返回一个值,该值是隐藏的,并且总是由一个阻塞的get()函数返回,那么这样的定
void
,而RunnableFuture只是一个接口,似乎如果我们要了解这一点,就必须了解实现类的性质(例如get()实现)
现在,如果RunnableFuture实际返回一个值,该值是隐藏的,并且总是由一个阻塞的get()函数返回,那么这样的定义(由于其实现限制,必须出现在类中,而不是在接口中)显然是合适的
因此,我想知道:这个接口的run()方法定义是否正确
作为反例:Runnable run()接口定义总是正确的
当使用实现接口Runnable的对象创建
线程,启动线程会导致对象的run方法
在单独执行的线程中调用
因此,即使Runnable不定义任何实现,接口也会告诉我们JVM如何通过Runnable接口实现线程,而不会对实现类施加不必要的非gauranteed契约
所以我有3个问题:
参见运行未来的合同由执行人执行。创建
FutureTask
时,提供Callable
或Runnable
和一个值。FutureTask
的run
方法类似于:
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
中,并在调用run
之前执行一些额外检查以确保FutureTask
处于正确状态。Hmmm。。。所以,也许你是在建议,通常情况下,我们不实现我们自己的未来,而是在惯用的“未来”编程中,我们应该简单地使用FutureTask。我看情况就是这样。但是如果是这样的话,我想知道RunnableFuture在JDK中是定制可扩展的是否明智。如果我误解了你的答案,请告诉我——我不确定你的观点的要旨是什么。谢谢。@jayunit100我只是想澄清RunnableFuture
是如何实现的,因为您似乎对此感到困惑。你是对的,你几乎不需要从头开始实现你自己的未来
,你可以用FutureTask
作为基础,如果你必须的话,你可以在它的基础上进行构建。按照目前JDK的设置方式,没有理由RunnableFuture
本身不能成为一个具体的类(替换FutureTask
)。然而,我想设计师希望RunnableFuture
的使用尽可能灵活。