工作/任务窃取ThreadPoolExecutor

Ana*_*dar 7 java executor threadpool work-stealing

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

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

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

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

谢谢安迪

jta*_*orn 1

你可以实现一个自定义的 BlockingQueue 实现(我认为你主要需要实现offer()take()方法),它由一个“主”队列和 0 个或多个辅助队列支持。如果非空,take 总是从主后备队列中获取,否则它可以从辅助队列中提取。

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