gpt4 book ai didi

java - 从 (ExecutorService) CachedThreadPool 捕获异常

转载 作者:行者123 更新时间:2023-12-01 23:53:44 25 4
gpt4 key购买 nike

我们正在使用通过 ExecutorService#newCachedThreadPool 创建的 CachedThreadPool。 (Java 1.6)。我们在代码的其他地方遇到错误:“无法创建新的 native 线程”,我们已将其诊断为内存不足问题。当这个问题发生时,我们调用提交(我们使用提交,而不是执行)的代码块会变慢。我们怀疑 ThreadPool 在尝试创建新线程来处理任务时也存在同样的问题“无法创建新的 native 线程”,但我们无法确定。

有什么方法可以从 ExecutorService 内部捕获异常吗?为了百分百清楚,我不是在谈论分配给 ExecutorService 的任务,而是来自 ExecutorService 本身的任务。

最佳答案

Executors.newCachedThreadPool 创建一个具有无限最大线程池大小的 ThreadPoolExecutor(请注意 ThreadPoolExecutor 构造函数的第二个参数):

public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}

这意味着如果您提交任务的速度快于消耗速度,则会为每个新任务创建新线程,最终会达到系统限制并抛出“无法创建新的 native 线程”异常。

要解决此问题,您需要更改 ThreadPoolExecutor 的配置:

  1. 使用合理的ThreadPoolExecutor。
  2. ThreadPoolExecutor耗尽时选择适当的拒绝策略。

例如:

ExecutorService executorService = new ThreadPoolExecutor(5,200,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(1000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());

请阅读JavaDocs了解配置详细信息。

关于java - 从 (ExecutorService) CachedThreadPool 捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com