1

在阅读 Threadpool executor 的文档时,我看到如下:

当大量排队的任务被取消时,两个提供的方法 remove(java.lang.Runnable) 和 purge() 可用于协助存储回收。

我知道,如果取消任何任务,我可以使用这些方法来清理工作队列。我试图了解实际源中的哪个部分会自动进行清理。假设我从 10 个队列开始,其中 4 个任务被取消,当新任务到达时,队列大小是 6,还是会忽略 4 个取消的任务并重置为 10。

从来源我看到这个评论:

/**
 * Tries to remove from the work queue all
 * tasks that have been cancelled. This method can be useful as a
 * storage reclamation operation, that has no other impact on
 * functionality. Cancelled tasks are never executed, but may
 * accumulate in work queues until worker threads can actively
 * remove them. Invoking this method instead tries to remove them now.
 * However, this method may fail to remove tasks in
 * the presence of interference by other threads.*
 */ 
 public void purge() { 

但是有人可以告诉我工作线程在哪里主动删除源中取消的任务吗?

感谢您的时间,

4

1 回答 1

2

工作线程在正常运行期间会主动移除取消的任务,当它们从 ThreadPoolExecutor.getTask() 中的工作队列中 take() 任务时,并尝试运行它们。当代表 Runnable 工作单元的底层 FutureTask 调用其 FutureTask$Sync.innerRun() 时,它首先检查预期的 READY 状态 - 否则它返回。因此,如果任务被取消并且它已经从 workQueue 中删除,则会跳过执行。如果任务已经在运行,FutureTask.cancel() 的 mayInterruptIfRunning 标志确定是否尝试中断()。

这意味着,默认情况下,被取消的任务会一直留在 workQueue 中,直到有可用的 Worker 尝试处理它,发现任务被取消并完成处理。因此,有关队列大小的问题的答案取决于 Worker 是否已完成任何这些任务。ThreadPoolExecutor.purge() 允许您手动触发立即遍历 workQueue 以删除已取消的任务。

于 2013-08-05T23:21:31.063 回答