Java 从(ExecutorService)CachedThreadPool捕获异常

Java 从(ExecutorService)CachedThreadPool捕获异常,java,executorservice,Java,Executorservice,我们正在使用通过ExecutorService#newCachedThreadPool创建的CachedThreadPool。(Java1.6)。代码中的其他地方出现了错误:“无法创建新的本机线程”,我们已将其诊断为内存不足问题。当这个问题发生时,我们调用submit(我们使用submit,而不是execute)的代码块会变慢。我们怀疑线程池在尝试创建新线程来处理任务时遇到了同样的问题“无法创建新的本机线程”,但我们不能确定 有没有办法从Executor服务内部捕获异常? 100%清楚地说,我不

我们正在使用通过ExecutorService#newCachedThreadPool创建的CachedThreadPool。(Java1.6)。代码中的其他地方出现了错误:“无法创建新的本机线程”,我们已将其诊断为内存不足问题。当这个问题发生时,我们调用submit(我们使用submit,而不是execute)的代码块会变慢。我们怀疑线程池在尝试创建新线程来处理任务时遇到了同样的问题“无法创建新的本机线程”,但我们不能确定

有没有办法从Executor服务内部捕获异常?
100%清楚地说,我不是说给ExecutorService的任务,而是指ExecutorService本身。

执行者。newCachedThreadPool创建了一个线程池大小不受限制的
ThreadPoolExecutor
(请注意
ThreadPoolExecutor
构造函数的第二个参数):


有关配置详细信息,请阅读。

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


有关配置的详细信息,请阅读。

您可以使用一个自定义类来实现Runnable,并在其中包含一个expetions集合,如下所示:

public class MyRunnable implements Runnable {
    private List<Exception> exceptions;

    ...

    public void addException(Exception e) { ... }
    public void getExceptions(){ ... }
}
公共类MyRunnable实现Runnable{
私人名单例外情况;
...
公共无效附加例外(例外e){…}
public void getExceptions(){…}
}

在所有可运行程序完成其执行后,您可以检查它们内部的异常,并抛出另一个异常作为响应。

您可以使用一个自定义类来实现可运行程序,其中包含一组异常,如下所示:

public class MyRunnable implements Runnable {
    private List<Exception> exceptions;

    ...

    public void addException(Exception e) { ... }
    public void getExceptions(){ ... }
}
公共类MyRunnable实现Runnable{
私人名单例外情况;
...
公共无效附加例外(例外e){…}
public void getExceptions(){…}
}

在所有可运行程序完成执行后,您可以检查它们内部的异常,并抛出另一个异常作为响应。

也许您应该进行线程转储,看看所有这些线程都将运行到哪里。这不应该发生。这肯定是一个系统负载问题。我知道它不应该走了。这是由于下游依赖失败和我们有重试逻辑造成的。线程排队等待重试。请参阅,也许您应该执行线程转储,并查看所有线程的去向。这不应该发生。这肯定是一个系统负载问题。我知道它不应该走了。这是由于下游依赖失败和我们有重试逻辑造成的。线程已排队等待重试。请参阅,谢谢。我一直在翻阅文档,我知道为什么会发生这种情况,但我想知道是否有任何方法可以捕捉到错误?我必须自己写线程工厂吗?@JohnHinnegan我不明白你为什么要抓住这个错误。我认为对于长时间运行的任务使用无限大小的线程池是一种错误的设计。它们不会长时间运行。我并不反对无边界池有风险或完全错误。但是,如果主机上出现其他问题,固定池可能会出现此问题。我正试图在我的系统中构建健壮的监控,但这个错误突然出现,并且在我们系统的一部分中未被发现。我知道这是一个错误,因为我们在别处发现了它(很明显,它对JVM是全局的)。当你回答的时候,我并没有怀疑什么是被拒绝的执行者。我想这回答了我的问题。我想我可以实现其中一个来处理异常。谢谢。我一直在翻阅文档,我知道为什么会发生这种情况,但我想知道是否有任何方法可以捕捉到错误?我必须自己写线程工厂吗?@JohnHinnegan我不明白你为什么要抓住这个错误。我认为对于长时间运行的任务使用无限大小的线程池是一种错误的设计。它们不会长时间运行。我并不反对无边界池有风险或完全错误。但是,如果主机上出现其他问题,固定池可能会出现此问题。我正试图在我的系统中构建健壮的监控,但这个错误突然出现,并且在我们系统的一部分中未被发现。我知道这是一个错误,因为我们在别处发现了它(很明显,它对JVM是全局的)。当你回答的时候,我并没有怀疑什么是被拒绝的执行者。我想这回答了我的问题。我想我可以实现其中一个来处理异常。
public class MyRunnable implements Runnable {
    private List<Exception> exceptions;

    ...

    public void addException(Exception e) { ... }
    public void getExceptions(){ ... }
}