在我的项目中,我构建了一个Java执行框架,它接收来自客户端的工作请求。工作(不同规模)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与一个ThreadPool相关联。 ThreadPools的配置方式使得引擎的整体性能最佳。工作/任务窃取ThreadPoolExecutor
这种设计可以帮助我们有效地平衡请求,而大型请求不会占用系统资源。然而,有时当某些队列为空并且它们各自的线程池闲置时,解决方案变得无效。
为了让这个更好,我正在考虑实现一个工作/任务窃取技术,以便重载队列可以从其他ThreadPools获得帮助。但是,这可能需要实现我自己的执行程序,因为Java不允许将多个队列与ThreadPool关联,并且不支持工作窃取概念。
阅读Fork/Join,但这看起来不适合我的需求。任何建议或替代方法来构建此解决方案可能会非常有帮助。
感谢 安迪
您应该考虑如何保持所有CPU忙碌。如果您正在充分利用您的CPU,那么您的某些线程是否空闲并不重要。 – 2012-04-14 12:45:50
如果您的线程池拥有与cpus一样多的线程,则即使所有其他线程池都处于空闲状态,任何单独的线程池都可以“窃取”所有cpus。 – 2012-04-14 12:50:53
@PeterLawrey - 这是真的,但如果有很多池,那么如果所有池中的所有线程同时工作,则性能可能会很差。 – jtahlborn 2012-04-14 12:55:33