我想使用类似ThreadPoolExecutor的东西来管理在可用线程上运行一堆任务 . 这些任务都是相同的类型,但处理不同的帐户 . 可以定期添加这些帐户的新任务,我希望它能够检查并且不允许新任务开始,直到同一帐户的旧任务已经完成 . 最好的方法是什么?
示例
-
帐户“234”的任务已启动(通过ThreadPoolExecutor.execute())
-
帐户“238”的任务已启动(通过ThreadPoolExecutor.execute())
-
帐户“234”的新任务已创建但未添加执行,因为第一个“234”任务未完成(检查此问题的最佳方法是什么?)
-
帐户“238”的任务完成
-
帐户“238”的新任务启动(通过ThreadPoolExecutor.execute()),因为当前没有为该帐户运行
最好的方法是什么?只需要在等待/睡眠()中检查Runnable中的某些检查变量,以便完成“234”的第一个任务吗?或者有更好的解决方案吗?
3 回答
我毫不怀疑那些对这部分API有更多经验的人会有更好的想法,但这是我对这个主题的看法......
基本上,我'd start with a 2639163 and 2639164 queue. The 2639165 queue keeps track of what'当前正在运行,"waiting"队列会跟踪您阻止的任务 . 这些队列需要键入某种"group identifier"以便于查找(例如
Map<String, List<Runnable>
),例如,您的帐号我会看一下覆盖
execute
方法 . 在这里,我将新任务放入等待队列 .然后我会覆盖
beforeExecute
方法 . 在这里,我将在"running"队列中注册任务 .我'd override the ' afterExecute'方法 . 在这里,我将从"running"队列中删除已完成的任务,查找等待任务的队列(通过已完成任务的组标识符),并通过
execute
方法将队列中的第一个任务添加到执行程序中或者你可以像路易斯建议的那样做:P
一个简单的可能性也许过于简单 . 创建10个SingleThreadedExecutors . 对于每项任务
"hash" accountID采用accountID mod 10来查找相应的SingleThreadedExecutor . (实际上,accountID可能不是int,例如,如果它是#2639178_ s hashCode()mod 10) .
将任务提交给SingleThreadedExecutor .
这可能并不理想,因为帐户238的处理将被迫等到358完成,但至少您确定某个特定帐户(例如234)将永远不会同时运行 . 取决于您可以允许的延迟时间 . 显然,你可以使用Executors的数量和我所描述的简单化的“散列”algortihm .
我遇到了同样的问题 . 我的解决方案是使用HashSet .