Executors.newCachedThreadPool
创建一个ThreadPoolExecutor
具有无限的最大线程池大小(注意构造函数的第二个参数)ThreadPoolExecutor
:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
这意味着如果您提交任务的速度超过消耗率,将为每个新任务创建新线程,最终它将达到系统限制并抛出“无法创建新的本机线程”异常。
要解决此问题,您需要更改以下配置ThreadPoolExecutor
:
- 使用合理的 ThreadPoolExecutor。
ThreadPoolExecutor
用尽时选择适当的拒绝策略。
例如:
ExecutorService executorService = new ThreadPoolExecutor(5,200,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(1000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
请阅读JavaDocs了解配置细节。