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,但没有打印出“任务失败”
提交到
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