- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个自定义的 FutureTask
(未扩展)以在线程池等中使用。我需要特殊功能,并且无法直接扩展 FutureTask 的方法。为了帮助我做到这一点,我查看了默认实现。如果您无法访问代码,您可以在此处查看默认实现:
如您所见,它使用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/
聊聊JUC包下的底层支撑类-AbstractQueuedSynchronizer(AQS) juc包下的一堆并发工具类是我们日常开发特别是面试中常被拿来问的八股文之一,为了工作也好,为了面试也
在await AQS的方法(AbstractQueuedSynchronizer):我想知道 while (!isOnSyncQueue(node)) { 中 while 的含义 我觉得如果这个节点正
我正在查看 java.uti.concurrent.locks.AbstractQueuedSynchronizer 的源代码,acquire() 方法看起来像这样 - public final v
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我正在实现一个自定义的 FutureTask (未扩展)以在线程池等中使用。我需要特殊功能,并且无法直接扩展 FutureTask 的方法。为了帮助我做到这一点,我查看了默认实现。如果您无法访问代码,
我编写了一个使用 AbstractQueuedSynchronizer 的简单类。我写了一个代表“门”的类,如果打开则可以通过,如果关闭则阻塞。这是代码: public class GateBlock
大佬们,谁能给个LockSupport & AbstractQueuedSynchronizer的简单实用例子? javadocs 中给出的示例很紧张。 我理解 Semaphore 许可的使用。 感谢
我知道一些关于 AbstractQueuedSynchronizer 的细节。它是一个用于创建状态依赖类或同步器的框架。但是我没有得到在 ThreadPoolExecutor 的 Worker 中扩展
我试图从较高的层次理解 java 的并发 API 是如何使用 AbstractQueuedSynchronizer 作为构建 block 构建的。我在这个类中没有看到任何synchronized、wa
我无法弄清楚为什么几个“ajp-nio-8009-exec-XX”类型的线程被阻止。典型的线程转储堆栈跟踪如下所示: at sun.misc.Unsafe.park(Native Method)
我是一名优秀的程序员,十分优秀!