Java:在线程池中共享多个递归任务的工作线程

Java:在线程池中共享多个递归任务的工作线程,java,recursion,executorservice,Java,Recursion,Executorservice,有一个固定的线程池(大小为100),我想在我的应用程序中用于所有任务。 它用于限制服务器负载 Task=网络爬虫,将第一个作业提交到线程池。 该作业可以生成更多作业,依此类推。 一个作业=一个HTTP I/O请求。 问题 假设只有一个正在执行的任务生成了10000个作业。 这些作业现在在线程池队列中排队,所有100个线程都用于它们的执行。 假设我现在提交第二个任务。 第二个任务的第一个作业是队列中的第10001个作业。 它将仅在第一个任务排队的10000个作业之后执行。 所以,这是一个问题——我

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

Task=网络爬虫,将第一个作业提交到线程池。
该作业可以生成更多作业,依此类推。
一个作业=一个HTTP I/O请求。

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

假设我现在提交第二个任务。
第二个任务的第一个作业是队列中的第10001个作业。
它将仅在第一个任务排队的10000个作业之后执行。
所以,这是一个问题——我不希望第二个任务等待太久才开始第一个任务

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

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


谢谢!

我将使用多个队列,并从包含项目的随机队列中抽取。或者,您可以对哪个队列的优先级最高进行排序。

我建议使用单个队列并使用递归任务的“深度”来计算优先级。使用单个队列,当queue为空,多个队列周围不需要随机逻辑。

我同意,顶层请求使用单个池,子请求使用另一个池。您可能只想限制两个池的大小(即第一个池有10个,第二个池有100个)@MadProgrammer我不明白为什么我需要两个池:一个用于顶级请求,一个用于子请求。您能详细解释一下吗?@Olegolovanov创建两个池的主要原因是,当您耗尽第二个池,并且任何新请求排队等待时,第一个池可以继续处理传入的请求。它还允许要分别为两个池提供优先级,您可能需要检查以下内容:。如果您可以使任务实现可比性,此处的解决方案可能会很好。使用后进先出优先级队列如何,即最后提交的任务获得最高优先级?