在我的项目中,我正在构建一个Java执行框架,用于接收来自客户端的工作请求。工作(不同大小)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与ThreadPool相关联。 ThreadPools的配置方式使得引擎的整体性能达到最佳。
此设计有助于我们有效地平衡请求,并且大量请求不会最终占用系统资源。但是,当某些队列为空且其各自的线程池处于空闲状态时,解决方案有时会失效。
为了使这更好,我正在考虑实现工作/任务窃取技术,以便负载很重的队列可以从其他ThreadPools获得帮助。但是,这可能需要实现我自己的Executor,因为Java不允许多个队列与ThreadPool相关联,并且不支持工作窃取概念。
了解Fork / Join,但这似乎不适合我的需求。构建此解决方案的任何建议或替代方法都非常有用。
由于 安迪
答案 0 :(得分:2)
您是否考虑过ForkJoinPool? fork-join框架以一种很好的模块化方式实现,因此您只需使用工作窃取线程池。
答案 1 :(得分:2)
Java 8在Executors
类中具有工厂和实用程序方法。
有一个工作窃取线程池(here)的实现,我相信,这正是你想要的。
答案 2 :(得分:1)
您可以实现自定义BlockingQueue实现(我认为您主要需要实现offer()
和take()
方法),这些方法由“主”队列和0个或更多辅助队列支持。如果非空,则take将始终从主要后备队列中获取,否则它可以从次要队列中获取。