首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java AbstractQueuedSynchronizer还是自定义FutureTask的自定义同步?

Java AbstractQueuedSynchronizer还是自定义FutureTask的自定义同步?
EN

Stack Overflow用户
提问于 2013-12-10 21:26:50
回答 1查看 213关注 0票数 0

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

http://pastebin.com/HTe6WT9S

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

AQS *也许是事实上的标准,因为它是您应该在一般情况下使用的(pro) *可以复制大部分代码(pro) * FIFO的特性很有趣,但是它对FutureTask有吸引力吗?(中性)*也许它的特性使它比低级构造慢?(con) AtomicInteger &其他低级结构*可能是你能得到的最快速度?(pro) *必须实现self ((小) con) *没有FIFO (con)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-11 09:24:34

我刚回答了what's AQS used for。请先读一读。

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

代码语言:javascript
复制
    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() )来完成您的工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20505632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档