Java线程池超额认购
问题描述:
我主要是在线程池上运行的CPU密集型操作。 然而,有一定数量的等待敌人的外部事件并非一致发生。 由于在Java中,据我所知,没有一个线程池实现可以根据观察到的任务吞吐量自动调整线程数量(如Microsoft的CLR 4),是否至少有一种方法可以手动告诉线程池在阻塞操作开始时增加其大小,在结束时减小大小?Java线程池超额认购
例如,对于8个内核,池大小为8. 如果操作是CPU占用率为100%,则使用此固定池。 如果有一些阻塞操作,应该能够做到这一点:
pool.increase();
waitForSpecialKeyPress();
pool.decrease();
这里它是如何在微软的C++异步库正在做的是:Use Oversubscription to Offset Latency
答
Java 7的ForkJoinPool具有ManagedBlocker,可用于通知有关被阻塞的线程的池,以便在需要时调度更多线程。
编辑:我忘了提及,这些类也可用于Java 6作为jsr166y。
答
你可以扩展ThreadPoolExecutor
添加自己的increase()
和decrease()
函数,它们可以做到简单的setMaximumPoolSize(getMaximumPoolSize() +/- 1)
。
确保同步这些方法,以确保您不会意外地混淆池大小。