【发布时间】:2012-07-24 22:30:04
【问题描述】:
有一个固定线程池(大小为 100),我想将其用于我的应用程序中的所有任务。 用于限制服务器负载。
Task = 网络爬虫,将第一个作业提交到线程池。
该工作可以产生更多工作,等等。
一项作业 = 一项 HTTP I/O 请求。
问题
假设只有一个正在执行的任务,它产生了 10000 个作业。
这些作业现在在线程池队列中排队,所有 100 个线程都用于执行它们。
假设我现在提交第二个任务。
第二个任务的第一个作业是队列中的第 10001 个。
它只会在第一个任务排队的 10000 个作业之后执行。
所以,这是一个问题 - 我不希望第二个任务等待这么长时间才能开始它的第一个工作。
想法
我想到的第一个想法是创建一个自定义 BlockingQueue 并将其传递给线程池构造函数。
该队列将包含多个阻塞队列,每个任务一个。
然后,它的 take 方法会选择一个随机队列并从中取出一个项目。
我的问题是,当它的任务完成时,我看不到如何从这个列表中删除一个空队列。这意味着部分或所有工作人员可能会在 take 方法上被阻塞,等待来自已完成任务的作业。
这是解决此问题的最佳方法吗?
我无法在书籍或互联网上找到它的任何模式:(
谢谢!
【问题讨论】:
-
你可能想看看这个:stackoverflow.com/questions/807223/…。如果你能让你的任务实现 Comparable,那么这里的解决方案可能会很好。
-
如何使用LIFO优先队列,即最后提交的任务获得最高优先级?
标签: java recursion executorservice