首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程执行器$Worker扩展AbstractQueuedSynchronizer的原因

线程执行器$Worker扩展AbstractQueuedSynchronizer的原因
EN

Stack Overflow用户
提问于 2017-02-12 15:07:47
回答 1查看 866关注 0票数 2

我知道一些关于AbstractQueuedSynchronizer的细节。它是一个创建状态相关类或同步器的框架。但是,我没有必要在ThreadPoolExecutor的Worker中扩展这个类。

代码语言:javascript
复制
private final class Worker extends AbstractQueuedSynchronizer implements Runnable

从工人阶层的签名中可以看出,可以推断出以下情况:

  1. 当提交新的可运行/可调用任务时,将创建一个新的Worker对象。
  2. 工作人员的新对象可视为新线程。
  3. addWorker()方法将添加新的工作人员(或简单地说是一个任务),并调用worker.start()来启动线程。
  4. Worker类是非静态嵌套类,因此它可以访问ThreadPoolExecutor的所有变量。
  5. 工作类的run()方法内部调用runWorker(此) 公共void (){ runWorker(this);}
  6. runWorker()执行实际任务,如下所示: void runWorker(Worker w) { try { w.lock(); w.firstTask.run() } finally { w.unlock(); } }

AQS仅用于runWorker()方法的此锁和解锁。我们不能在这里使用一个ReentrantLock并保持简单的工人类吗?

此外,类还提供了有关这方面的文档,但我无法理解:

这个类机会主义地扩展了AbstractQueuedSynchronizer,以简化、获取和释放围绕每个任务执行的锁。这可以防止旨在唤醒等待任务的工作线程的中断,而不是中断正在运行的任务。我们实现了一个简单的不可重入的互斥锁,而不是使用ReentrantLock,因为我们不希望工作任务在调用池控制方法(如setCorePoolSize )时能够重新获取锁。

请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-12 15:33:52

关于你的问题的答案是来自javadoc的引文,你的帖子是:

我们实现了一个简单的不可重入的互斥锁,而不是使用ReentrantLock,因为我们不希望工作任务在调用池控制方法(如setCorePoolSize )时能够重新获取锁。

这是因为可能正在等待任务的线程是通过不锁定来指示的,即tryLock为它们返回true。在这种情况下,如果在这里使用ReentrantLock,会发生什么:接下来的操作顺序是可能的:

setCorePoolSize->interruptIdleWorkers->tryLock() (这里成功!) -> Thread.interrupt (这个工作线程)

这会导致工人打断自己。

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

https://stackoverflow.com/questions/42189195

复制
相关文章

相似问题

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