【问题标题】:Java AbstractQueuedSynchronizer vs. custom synchro for custom FutureTask?Java AbstractQueuedSynchronizer 与自定义 FutureTask 的自定义同步?
【发布时间】:2013-12-10 21:26:50
【问题描述】:

我正在实现一个自定义FutureTask(未扩展)以用于线程池等。我需要特殊功能,不能直接扩展 FutureTasks 方法。为了帮助我做到这一点,我查看了默认实现。如果无法访问代码,可以在此处查看默认实现:

http://pastebin.com/HTe6WT9S

如您所见,它使用AbstractQueuedSynchronizer。我的问题很简单,为什么?这个类是超级优化的还是主要是吸引人的 FIFO 特性?我最初的想法是使用AtomicInteger 和其他低级构造来实现我的自定义FutureTask,使用我对良好同步构造的平均知识来最佳地实现我的FutureTask,所以我可能不想要AQSs 较慢的功能,如果有的话。那么AQS 还提供其他功能吗?有什么好的论据支持/反对使用它吗?到目前为止,这是我的有限猜测:

AQS * 也许是事实上的标准,因为它是你应该在一般情况下使用的 (pro) * 可以复制大部分代码(亲) * FIFO 功能很有趣,但对于FutureTask 是否可取? (中性的) * 也许它的特性使它比低级构造慢? (反面) AtomicInteger 和其他低级结构 * 可能尽可能快? (亲) * 必须实现自我((次要)骗局) * 没有先进先出 (con)

【问题讨论】:

    标签: java synchronization mutex atomic


    【解决方案1】:

    我刚刚回复了what's AQS used for。请先阅读。

    FutureTask 实例可以被许多不同的线程持有。例如:

        final FutureTask<Beef> killCows = new FutureTask<Beef>(
                new Callable<Beef>() {
    
                    @Override
                    public Beef call() throws Exception {
                        return new Beef();
                    }
                });
    
        new Thread(new Runnable() {
    
            @Override
            public void run() {
    
                Beef beef = killCows.get();
                // prepare sirloin
    
            }
        }).start();
    
        new Thread(new Runnable() {
    
            @Override
            public void run() {
    
                Beef beef = killCows.get();
                // prepare rib
    
            }
        }).start();
    

    所有调用FutureTask.get() 的线程都将等待(阻塞)直到任务完成或取消。必须有某种机制来通知和唤醒它们。所以答案是AQS。正如您所提到的,它确实创建了一个 FIFO 队列,队列中的每个节点都代表一个线程。任务完成后,所有节点都会收到通知,并有权限一一访问临界区。

    请不要再做一个 FutureTask 而是先理解它。也许您可以覆盖那些受保护的方法,例如 done() 来完成您的工作。

    【讨论】:

    • 恐怕我做不到——我基本上已经看过所有的机会来做到这一点,但我必须自己实现。但是非常感谢您非常有帮助的回答!
    • @bombax 您可能会更多地谈论您的要求作为另一个问题。让我们检查一下它是否确实需要一个新的 FutureTask。
    • 谢谢!要求及其所有血腥细节,包括这一切背后的动机,都在这里:stackoverflow.com/questions/20552211/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多