完全控制Android中的线程队列

时间:2013-01-07 18:17:39

标签: java android multithreading thread-safety threadpool

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

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

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

感谢任何帮助。

2 个答案:

答案 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()可以更好地保证池中只有一个线程。