gpt4 book ai didi

Java AbstractQueuedSynchronizer 与自定义 FutureTask 的自定义同步?

转载 作者:行者123 更新时间:2023-12-01 13:43:35 24 4
gpt4 key购买 nike

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

http://pastebin.com/HTe6WT9S

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

AQS* 也许是事实上的标准,因为这是您在一般情况下应该使用的标准(专业版)* 可以复制大部分代码(专业版)* FIFO 功能很有趣,但是它对于 FutureTask 来说是理想的吗? (中性的)* 也许它的特性使它比低级构造慢? (反)AtomicInteger 和其他低级构造* 可能尽可能快? (专业人士)* 必须实现 self ((次要)骗局)* 无 FIFO(缺点)

最佳答案

我刚刚回复了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,而是先理解它。也许您可以重写那些 protected 方法,例如 done() 来完成您的工作。

关于Java AbstractQueuedSynchronizer 与自定义 FutureTask 的自定义同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20505632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com