我知道一些关于AbstractQueuedSynchronizer的细节。它是一个创建状态相关类或同步器的框架。但是,我没有必要在ThreadPoolExecutor的Worker中扩展这个类。
private final class Worker extends AbstractQueuedSynchronizer implements Runnable从工人阶层的签名中可以看出,可以推断出以下情况:
addWorker()方法将添加新的工作人员(或简单地说是一个任务),并调用worker.start()来启动线程。run()方法内部调用runWorker(此)
公共void (){ runWorker(this);}runWorker()执行实际任务,如下所示:
void runWorker(Worker w) { try { w.lock(); w.firstTask.run() } finally { w.unlock(); } }AQS仅用于runWorker()方法的此锁和解锁。我们不能在这里使用一个ReentrantLock并保持简单的工人类吗?
此外,类还提供了有关这方面的文档,但我无法理解:
这个类机会主义地扩展了AbstractQueuedSynchronizer,以简化、获取和释放围绕每个任务执行的锁。这可以防止旨在唤醒等待任务的工作线程的中断,而不是中断正在运行的任务。我们实现了一个简单的不可重入的互斥锁,而不是使用ReentrantLock,因为我们不希望工作任务在调用池控制方法(如setCorePoolSize )时能够重新获取锁。
请帮帮忙
发布于 2017-02-12 15:33:52
关于你的问题的答案是来自javadoc的引文,你的帖子是:
我们实现了一个简单的不可重入的互斥锁,而不是使用ReentrantLock,因为我们不希望工作任务在调用池控制方法(如setCorePoolSize )时能够重新获取锁。
这是因为可能正在等待任务的线程是通过不锁定来指示的,即tryLock为它们返回true。在这种情况下,如果在这里使用ReentrantLock,会发生什么:接下来的操作顺序是可能的:
setCorePoolSize->interruptIdleWorkers->tryLock() (这里成功!) -> Thread.interrupt (这个工作线程)
这会导致工人打断自己。
https://stackoverflow.com/questions/42189195
复制相似问题