Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 如何处理ExecutorService任务引发的异常?_Java_Multithreading_Exception Handling - Fatal编程技术网

Java 如何处理ExecutorService任务引发的异常?

Java 如何处理ExecutorService任务引发的异常?,java,multithreading,exception-handling,Java,Multithreading,Exception Handling,我正在使用ExecutorService在系统上运行测试。当测试因某种原因失败时,问题就会出现。这些原因可能很多,当然我正在记录这些错误 但我想实时通知用户一个错误。因此,当错误发生时,它到达顶部的时间越长,它就成为一个带有消息和原因的testfailedeexception。我想捕获此异常并通知用户,但我似乎无法做到这一点 这是一个实际启动运行测试的线程的方法示例: public void asyncRunTestfixture(Concretetest concretetest) {

我正在使用ExecutorService在系统上运行测试。当测试因某种原因失败时,问题就会出现。这些原因可能很多,当然我正在记录这些错误

但我想实时通知用户一个错误。因此,当错误发生时,它到达顶部的时间越长,它就成为一个带有消息和原因的
testfailedeexception
。我想捕获此异常并通知用户,但我似乎无法做到这一点

这是一个实际启动运行测试的线程的方法示例:

public void asyncRunTestfixture(Concretetest concretetest) {

    ExecutorService executor = Executors.newCachedThreadPool();
    FutureTask<Boolean> futureTask_1 = new FutureTask<Boolean>(new Callable<Boolean>() {
        @Override
        public Boolean call() throws TestFailedException {
            return RunTestInFixture(concretetest);          
        }

      });
      executor.execute(futureTask_1);
      executor.shutdown(); 
}
public void asyncRunTestfixture(Concretetest-Concretetest){
ExecutorService executor=Executors.newCachedThreadPool();
FutureTask FutureTask_1=新的FutureTask(新的可调用(){
@凌驾
公共布尔调用()抛出TestFailedException{
返回运行测试结构(混凝土测试);
}
});
执行人。执行(未来任务1);
executor.shutdown();
}
但即使调用抛出异常,我也无法在其他地方捕捉到它,无论是现在还是如果我说asyncRunTestfixture方法抛出异常


我怎样才能解决这个问题

对已完成的
futureTask_1
调用
get()
将引发
ExecutionException
通常在任务引发某些异常时包装
原因。

调用
futureTask_1.get()
以获取结果时,将向您引发异常。它将被包装在一个
ExecutionException
中。请参考另一个@ErwinBolwidt的回答,当抛出异常时会抛出异常。异常被池工作线程捕获,处理程序将异常对象的引用存储在
未来的
中。最后,当客户端调用future的
get()
方法时,抛出
ExecutionException
。只是没有想到在这里做这件事-呸!:)谢谢工作完美。