我主要是在线程池上运行的CPU密集型操作.然而,操作具有一定量的等待外部事件,这些事件不会在时间上均匀地发生.因为在Java中,据我所知,没有一个线程池实现可以根据观察到的任务吞吐量自动调整其线程数(如在Microsoft的CLR 4中),至少有一种方法可以手动告诉线程池到阻塞操作开始时增加其大小,结束时减小?
例如,对于8个核心,池大小为8.如果操作是100%CPU绑定,则只使用此固定池.如果有一些阻塞操作,应该可以这样做:
pool.increase();
waitForSpecialKeyPress();
pool.decrease();
Run Code Online (Sandbox Code Playgroud)
以下是在Microsoft的C++异步库中执行的操作:使用Oversubscription来抵消延迟
Java 7 的 ForkJoinPool 有一个ManagedBlocker,它可以用来让池了解阻塞的线程,以便它可以在必要时调度更多的线程。
编辑:我忘了提及,这些类也可用于 Java 6,如jsr166y。