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

Java 可运行的未来接口定义(jdk),java,interface,runnable,future,Java,Interface,Runnable,Future,我对RunnableFuture接口定义的“正确性”有一个疑问。这可能是关于在java中定义接口注释的正确争用的问题 RunnableFuture的run()方法的定义: 将此未来设置为其计算结果 然而,这显然不可能总是正确的,因为run()的返回类型是void,而RunnableFuture只是一个接口,似乎如果我们要了解这一点,就必须了解实现类的性质(例如get()实现) 现在,如果RunnableFuture实际返回一个值,该值是隐藏的,并且总是由一个阻塞的get()函数返回,那么这样的定

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

RunnableFuture的run()方法的定义:

将此未来设置为其计算结果

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

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

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

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

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

因此,即使Runnable不定义任何实现,接口也会告诉我们JVM如何通过Runnable接口实现线程,而不会对实现类施加不必要的非gauranteed契约

所以我有3个问题:

  • RunnableFuture的文档是否可能在某些情况下不正确

  • 如果(1)是这样,那么通过java约定是否可以接受

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


  • 参见

    运行未来的合同由执行人执行。创建
    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
    的使用尽可能灵活。