Android中完全可控的线程队列

3

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

总结:

1.是否有办法强制ThreadPoolExecutor一次仅运行1个任务?

2.如何检查队列以防止重复任务(它们由String值区分)?

3.如何干净地从队列中删除'旧'任务?

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

任何帮助都将不胜感激。


请展示您用于实例化执行器的代码。 - Jason Nichols
corePoolSize不是你想的那样。maximumPoolSize才是你需要的。 - Leonidos
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对象取消任务。或者您可以关闭执行器并创建新的执行器。


创建您自己的任务名称列表,或者更好的方式是使用Map<String, Task> - assylias

1
也许使用 Executors.newSingleThreadExecutor() 可以更好地保证线程池中只有一个线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接