FixedThreadPool
用途:LinkedBlockingQueue
_Integer.MAX_VALUE
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
因此,它实际上是非阻塞的,就像您可以offer
/put
百万Runnable
个实例一样,这当然是不必要地使用内存来保存数百万个对象,尽管您的内存fixedPoolSize
相对要小得多,比如 5/10。
一种可以直接改善这种情况的方法是使用FixedThreadPool
有限的队列大小:
int nThreads = 10;
int maxQSize = 1000;
ExecutorService service = new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQSize))
使用上述方法,您的put
调用将阻止 中的1000
可运行对象Q
,但一旦其中一些完成,put
将继续。通过这样做invokeAll
,将有 10 个正在运行的线程和最多 1000 个可运行实例。