我正在实现一个自定义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)
发布于 2013-12-11 09:24:34
我刚回答了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() )来完成您的工作。
https://stackoverflow.com/questions/20505632
复制相似问题