工作/任务窃取ThreadPoolExecutor

时间:2012-04-14 12:32:36

标签: java threadpool executor work-stealing

在我的项目中,我正在构建一个Java执行框架,用于接收来自客户端的工作请求。工作(不同大小)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与ThreadPool相关联。 ThreadPools的配置方式使得引擎的整体性能达到最佳。

此设计有助于我们有效地平衡请求,并且大量请求不会最终占用系统资源。但是,当某些队列为空且其各自的线程池处于空闲状态时,解决方案有时会失效。

为了使这更好,我正在考虑实现工作/任务窃取技术,以便负载很重的队列可以从其他ThreadPools获得帮助。但是,这可能需要实现我自己的Executor,因为Java不允许多个队列与ThreadPool相关联,并且不支持工作窃取概念。

了解Fork / Join,但这似乎不适合我的需求。构建此解决方案的任何建议或替代方法都非常有用。

由于 安迪

3 个答案:

答案 0 :(得分:2)

您是否考虑过ForkJoinPool? fork-join框架以一种很好的模块化方式实现,因此您只需使用工作窃取线程池。

答案 1 :(得分:2)

Java 8在Executors类中具有工厂和实用程序方法。 有一个工作窃取线程池(here)的实现,我相信,这正是你想要的。

答案 2 :(得分:1)

您可以实现自定义BlockingQueue实现(我认为您主要需要实现offer()take()方法),这些方法由“主”队列和0个或更多辅助队列支持。如果非空,则take将始终从主要后备队列中获取,否则它可以从次要队列中获取。

事实上,拥有1个池可能更好,所有工作者都可以访问所有队列,但“更喜欢”特定队列。您可以通过为不同的工作人员分配不同的优先级来提出最佳工作比率。在满载系统中,您的工人应该以最佳比例工作。在欠载系统中,您的员工应该能够帮助其他队列。