该程序同时存在哪些错误?

时间:2019-02-24 10:03:56

标签: java concurrency java.util.concurrent threadpoolexecutor concurrenthashmap

我有一个程序同时存在奇怪的错误。

该程序的作用:

  1. 每个EVENT_LOOP_PAUSE_DURATION_IN_MS执行事件循环。
  2. 对于每个给定任务,执行处理器TaskProcessor
  3. 每个500 ms都会打印我的执行器的队列大小。

我希望每个taskId队列中最多有一个任务。因此,当我在队列中添加任务时,我会检查任务是否已经存在。如果没有任务,我添加它。在任务处理结束时,我从activeTasks映射中删除了任务。

如果运行该程序,则会看到以下输出:

ERROR: 50
ERROR: 70
ERROR: 80
ERROR: 90
ERROR: 110
ERROR: 120
ERROR: 120
ERROR: 140

因此,有一个错误。我不知道为什么,但是线程池队列的大小正在无限增加。

您可以看到,我在程序的2点处删除了活动任务:

  1. 任务完成后,在finally的{​​{1}}块中。
  2. 我在事件循环中删除了过时的任务。

因此,如果我删除了代码(该代码删除了第(2)点中的任务),则该错误消失了。我不了解这种行为。

TaskProcessor

1 个答案:

答案 0 :(得分:0)

问题出在点(2),您正在从activeTasks映射中删除过时的任务。但是它们仍然提交给ExecutorService。由于您已从地图中将其删除,因此while循环执行另一个循环时,相同的任务将重新提交给ExecutorService。这导致任务数量增加。