我的CPU密集型操作主要是在线程池上运行的。然而,操作对外部事件有一定的等待时间,这些事件并不是在时间上均匀发生的。因为在Java中,据我所知,没有一个线程池实现可以根据观察到的任务吞吐量自动调整线程数量(就像在Microsoft的CLR 4中一样),那么是否至少有一种方法可以手动告诉线程池在阻塞操作开始时增加线程池的大小,而在阻塞操作结束时减少线程池的大小?
例如使用8核,池大小为8。如果操作是100% CPU限制,只需使用此固定池即可。如果有一些阻塞操作,应该可以这样做:
pool.increase();
waitForSpecialKeyPress();
pool.decrease();这是如何在微软的C++异步库中实现的:Use Oversubscription to Offset Latency
发布于 2011-04-13 00:37:01
Java7的ForkJoinPool有一个ManagedBlocker,它可以用来让池知道阻塞的线程,以便在必要时可以调度更多的线程。
编辑:我忘了提一下,这些类也可以作为jsr166y在Java6中使用。
发布于 2011-04-13 00:24:21
您可以扩展ThreadPoolExecutor以添加您自己的increase()和decrease()函数,这两个函数执行简单的setMaximumPoolSize(getMaximumPoolSize() +/- 1)。
确保同步这些方法,以确保您不会意外地弄乱池大小。
https://stackoverflow.com/questions/5638399
复制相似问题