Main 方法 catch 块中未捕获运行时异常

问题描述 投票:0回答:1

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyMainThread {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        try {

            executor.submit(new MyTask());

        } catch (Exception e) {
            System.out.println("Exception caught in main thread: " + e.getMessage());
        }
        executor.shutdown();
    }
}
public class MyTask implements Runnable {
    @Override
    public void run() {
        // Some meaningful computation
        System.out.println("Executing task...");
        // Then an exception is thrown
        throw new RuntimeException("Task failed!");
    }
}

main方法中的catch块没有被调用并且“Task Failed”没有被打印

“打印了 ExecutionTask,但没有打印出“任务失败”

java executorservice java-threads runtimeexception
1个回答
0
投票

提交到

ExecutorService
的任务在单独的线程中执行,您将无法从主线程(提交任务的线程)捕获任务中发生的异常。

当您提交任务时,它们会返回一个

Future
类型的对象,您可以使用该对象获取结果、取消任务或检查状态。

在您的情况下,您可以使用

future.get()
来阻止(等待)直到任务完成。

try {

            Future<?> future = executor.submit(new MyTask());
            future.get();

     } catch (InterruptedException e) {
            //handle as needed
     }
     catch (ExecutionException e) {
            System.out.println("Exception caught in task: " + 
                    e.getCause().getMessage());
     }
        executor.shutdown();

任务执行期间抛出的任何异常都包含在

ExecutionException
中,您可以通过调用
e.getCause()
获取实际的异常。


注意:

future.get()
是阻塞的,即你的主线程一直在等待任务完成,这通常不是我们想要的。您可以将
future.get()
与超时参数一起使用,或使用
CompletableFuture
接口来使用回调。

© www.soinside.com 2019 - 2024. All rights reserved.