8

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

这种设计有助于我们有效地对请求进行负载平衡,并且大型请求最终不会占用系统资源。但是,有时当某些队列为空并且它们各自的线程池处于空闲状态时,该解决方案变得无效。

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

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

谢谢安迪

4

3 回答 3

4

Executors.newWorkStealingPool

Java 8 在类中有工厂和实用方法ExecutorsExecutors.newWorkStealingPool

这是一个工作窃取线程池的实现,我相信,这正是你想要的。

于 2016-02-20T14:37:59.607 回答
2

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

于 2012-04-14T13:02:14.107 回答
1

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

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

于 2012-04-14T12:50:32.780 回答