【发布时间】:2010-11-10 20:40:23
【问题描述】:
我有一个任务,我计划通过ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, rate, ...) 定期运行。用户可以手动取消此任务,这会调用ScheduledFuture.cancel(true)。出于某种原因,可能取决于他们何时取消此任务,工作线程(执行程序用来运行我的任务)在我的任务的 run() 方法退出后似乎保持中断状态。
虽然工作线程(从池中获取并重用)会在使用现有钩子(通过ThreadPoolExecutor.beforeExecute() 或ThreadPoolExecutor.afterExecute())开始新任务之前清除其中断状态。但在默认实现中并没有这样做。
我有两个问题:
- 怎么让工作线程处于设置了中断状态的状态?
- 为什么默认实现在开始新任务之前不清除中断状态?
【问题讨论】:
-
尽管使用了各种时间,但我看不到这种行为。你能描述一下如何可靠地重现这个吗?
-
我希望我自己能更好地理解它,任务本身使用了使用 ReentrantLock.lockInterruptibly() 的 ArrayBlockingQueue.take()。我相信这与它有关,我仍在尝试了解它是如何发生的(问题的第二部分)
-
您使用的是哪个 JDK(版本、供应商、操作系统等)?
-
我想我找到了:任务启动了一个单独的预取线程,该线程将工作单元放入队列中,关闭竞争条件将终止工作单元留在队列中,强制提前关闭重新触发竞争条件(并中断线程)。
标签: java multithreading concurrency interrupt executorservice