3

我在控制线程队列时遇到问题。我的应用程序使用 MySQL 数据库读取部分数据,对其进行处理并在屏幕上显示结果。队列中大约有 20 个任务,但一次只有一个正在处理。用户也可以取消当前队列,并从数据库中“询问”另一部分数据。现在我正在使用带有“丢弃最旧策略”的 ThreadPoolExecutor,因为我正在从队列中删除“最旧”部分数据,并在用户需要时将其替换为“新”部分。我的问题是,即使 corePoolSize 设置为 1,有时也会有 4 个线程同时运行。我不知道如何彻底清空未启动任务的队列。现在我正在使用 getQueue() 并从列表中删除所有项目,但我读到它是不好的方式。

结论:
1.有没有办法强制 ThreadPoolExecutor 一次只运行 1 个任务?
2.如何检查队列以防止任务重复(它们以String值区分)?
3. 如何从队列中删除干净的“旧”任务?

或者也许我应该使用其他机制?

任何帮助表示赞赏。

4

2 回答 2

2
1. Is there any way to force ThreadPoolExecutor to run just 1 task at once?

Executors.newSingleThreadExecutor()

2. How to check queue to prevent duplicates of tasks (they are distinguished by String 

创建您自己的任务名称列表。在将任务发送给执行者之前将任务名称添加到此列表中,并在任务执行后删除任务名称。

3. How to remove cleanly 'old' tasks from queue?

当您将任务添加到执行程序时,您将获得 Future 对象。您可以使用 future 取消任务。或者您可以关闭执行程序并创建新的执行程序)

于 2013-01-07T18:45:55.977 回答
1

也许使用Executors.newSingleThreadExecutor()会给你一个更好的保证,池中只有一个线程。

于 2013-01-07T18:21:11.500 回答