Java:在线程池中共享工作程序以执行多个递归任务

时间:2012-07-24 22:30:04

标签: java recursion executorservice

有一个固定的线程池(让它的大小= 100),我想用于我的应用程序中的所有任务。 它用于限制服务器负载。

Task = web crawler,将第一个作业提交给线程池 这项工作可以创造更多的就业机会,等等 一个作业=一个HTTP I / O请求。

问题
假设只有一个执行任务,即生成10000个作业 这些作业现在在线程池队列中排队,并且所有100个线程都用于执行。

假设我现在提交第二项任务 第二个任务的第一个任务是队列中的第1000个任务 它将仅在第一个任务排队的10000个作业之后执行 所以,这是一个问题 - 我不希望第二个任务等待这么长时间才能开始它的第一份工作。


我想到的第一个想法是创建一个自定义BlockingQueue 并将其传递给线程池构造函数。
该队列将包含多个阻塞队列,每个任务一个 然后, take 方法将选择一个随机队列并从中获取一个项目 我的问题是,当它的任务完成时,我没有看到如何从该列表中删除空队列。这意味着部分或全部工作人员可能会被阻止采取方法,等待已完成任务的工作。

这是解决此问题的最佳方法吗?
我无法在书本或互联网上找到任何模式:(

谢谢!

2 个答案:

答案 0 :(得分:2)

我会使用多个队列并从随机的包含项目的队列中提取。或者,您可以优先考虑哪个队列应获得最高优先级。

答案 1 :(得分:0)

我建议使用单个PriorityBlockingQueue并使用递归任务的“深度”来计算优先级。使用单个队列时,当队列为空时,工作程序会被阻塞,并且不需要围绕多个队列的随机化逻辑。