【问题标题】:runnable future interface definition (jdk)可运行的未来接口定义(jdk)
【发布时间】:2012-09-03 22:51:34
【问题描述】:

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

RunnableFuture的run()方法的定义:

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

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

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

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

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

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

因此,即使 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

【问题讨论】:

    标签: java interface runnable future


    【解决方案1】:

    RunnableFuture的合约由FutureTask执行。创建FutureTask 时,您提供CallableRunnable 和一个值。 FutureTaskrun 方法看起来像:

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

    【讨论】:

    • 嗯...所以也许你建议,通常情况下,我们不实现自己的未来,而是在惯用的“未来”编程中,我们应该简单地使用 FutureTask。我可以看到情况就是这样。但如果是这样,我想知道 RunnableFuture 在 JDK 中是否完全可自定义扩展是否明智。如果我误解了你的答案,请告诉我——我不确定你的观点的主旨是什么。谢谢。
    • @jayunit100 我只是想澄清RunnableFuture 的实现方式,因为您似乎对此感到困惑。你是对的,你几乎不需要从头开始实现你自己的Future,你可以使用FutureTask作为基础,如果需要的话,可以使用它来构建。当前设置 JDK 的方式,没有理由 RunnableFuture 本身不能是一个具体的类(替换 FutureTask)。但是,我想设计师希望RunnableFuture 的使用尽可能灵活。
    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多