我在控制线程队列时遇到问题。我的应用程序使用MySQL数据库来读取部分数据,处理数据并在屏幕上显示结果。队列中有大约20个任务,但只有一个是一次处理。用户也可以取消当前队列,并从数据库“询问”另一部分数据。现在我正在使用ThreadPoolExecutor“丢弃最旧的策略”,因为我从队列中删除“最旧”的数据部分,并在用户需要时用“新”部分替换它。我的问题是,即使corePoolSize设置为1,有时也会有4个线程同时运行。我不知道如何干净地清空未启动任务的队列。现在我正在使用getQueue()并从列表中删除所有项目,但我读到这是不好的方法。在将新任务添加到队列之前,我想检查队列中是否没有这样的任务(具有相同的数据部分),我也不知道如何实现这一点。
结论:
1.有没有办法强制ThreadPoolExecutor一次只运行1个任务?
2.如何检查队列以防止重复任务(它们由字符串值区分)?
3.如何从队列中删除干净的“旧”任务?
或许我应该使用其他机制?
感谢任何帮助。
答案 0 :(得分: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来取消任务。或者您可以关闭执行程序并创建新的执行程序)
答案 1 :(得分:1)
也许使用Executors.newSingleThreadExecutor()
可以更好地保证池中只有一个线程。