Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未捕获Runnable中的异常,执行器将挂起_Java_Executorservice_Threadpoolexecutor - Fatal编程技术网

Java 未捕获Runnable中的异常,执行器将挂起

Java 未捕获Runnable中的异常,执行器将挂起,java,executorservice,threadpoolexecutor,Java,Executorservice,Threadpoolexecutor,我正在使用FixedThreadPool运行许多线程。方法doJobs()有时引发运行时异常,其stacktrace打印在控制台上,但未记录。这意味着在MyRunnable中的catch(Throwable)中不会捕获此异常。主要问题是,在此异常之后,执行器将停止执行任何已提交的线程,整个应用程序将挂起。如何可能不记录此异常?还有,为什么整个执行者没有继续,也没有完成,只是挂起而没有活动 class MyRunnable implements Runnable { public void

我正在使用FixedThreadPool运行许多线程。方法doJobs()有时引发运行时异常,其stacktrace打印在控制台上,但未记录。这意味着在
MyRunnable
中的
catch(Throwable)
中不会捕获此异常。主要问题是,在此异常之后,执行器将停止执行任何已提交的线程,整个应用程序将挂起。如何可能不记录此异常?还有,为什么整个执行者没有继续,也没有完成,只是挂起而没有活动

class MyRunnable implements Runnable {
    public void run() { 
        try {
            doJob();
        }
        catch(Error e){ log(e);}
        catch(Throwable e) {log(e);}
    }
}

//main method
final ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
for (final MyRunnable wc : runnables) {
    executor.execute(wc);
}
try {
    executor.awaitTermination(maxTime, TimeUnit.HOURS);
} catch (final InterruptedException e) {
    throw new RuntimeException(e);
}

需要查看
doJob
的代码。它可能正在将自己的stacktrace写入控制台并终止,而不是将异常冒泡到
doJob
调用,您可以在那里捕获它。我使用的某些库的某些代码将引发运行时异常。为什么它没有被抓住?如果它真的抛出了一个RuntimeException,那么它是Throwable的一个子类,您可以在这里捕获它。更有可能的是,它捕获并输出RuntimeException本身的堆栈跟踪,而不是冒泡。除非它提供了一个配置、钩子或另一个重写来更改此设置,否则我不确定您能对此做些什么…需要查看
doJob
的代码。它可能正在将自己的stacktrace写入控制台并终止,而不是将异常冒泡到
doJob
调用,您可以在那里捕获它。我使用的某些库的某些代码将引发运行时异常。为什么它没有被抓住?如果它真的抛出了一个RuntimeException,那么它是Throwable的一个子类,您可以在这里捕获它。更有可能的是,它捕获并输出RuntimeException本身的堆栈跟踪,而不是冒泡。除非它提供了一个配置、钩子或另一个覆盖来改变这一点,否则我不确定你能做什么。。。