【问题标题】:how to traverse a queue in javajava中如何遍历队列
【发布时间】:2013-02-11 15:11:43
【问题描述】:

我有一个ThreadPoolExecutor 来完成我的DownloadTask implements Runnable{private String taskId... 任务,我需要随时有可能从ThreadPoolExecutor 队列中获取定义任务,例如,使用任务ID:

mDownloadTasksPool.getQueue();

遍历队列并获得定义元素的最佳方法是什么?

可以有一个包含所有重复任务的列表,但它看起来不是很优雅。

【问题讨论】:

    标签: java android concurrency


    【解决方案1】:

    子类化您的 Runnables 以提供 taskID 的 getter(如果这是您的关键)。创建一个并发映射,将您的 taskID 映射到您放入队列中的 Runnable。子类化您的 ThreadPoolExecutor。在 beforeExecute 中,您从该映射中删除当前任务,因为它不再在队列中。您可能希望将 Runnable 强制转换为您的自定义类以使用该 taskID getter。

    【讨论】:

    • 我不想使用单独的集合对象,我只想使用带有 BlockingQueue 的 ThreadPoolExecutor。
    • 好吧,在这种情况下,您每次要查找任务时都必须遍历整个队列。这个队列也会被 TPE 使用,但好在 LinkedlockingQueue 和 ArrayBlockingQueue 的迭代器是弱一致的,不会抛出 ConcurrentModificationException。
    • ThreadPoolExecutor 本身没有 BlockingQueue。您必须在构造函数中提供自己的队列。 Executors 提供的大多数多线程 TPE 都使用 LinkedBlockingQueues。
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多