我需要在executorservice中处理运行时异常吗?我在Spring Boot Web应用程序中尝试了一个示例,尽管有异常
,代码仍将执行代码如下:
@RestController
class WelcomeController {
ExecutorService es = Executors.newSingleThreadExecutor();
@GetMapping("/sayhi")
public String sayHi() {
es.submit(() -> {
System.out.println("hello");
int a = 0;
if (10 / a == 1) {
}
});
return "hi";
}
}
答案 0 :(得分:1)
在一个线程中引发异常时,除非您做出某些操作(例如使用Future),否则该异常不会传播到其他线程。这里的线程导致异常并死亡,但是程序的其余部分不受影响。
执行程序为丢失的线程创建替换项,请参见api文档:
创建一个执行程序,该执行程序使用在不受限制的队列上运行的单个工作线程,并在需要时使用提供的ThreadFactory创建新线程。与其他等效的newFixedThreadPool(1,threadFactory)不同,保证返回的执行程序不能重新配置为使用其他线程。
在我看来,让任务处理它们引起的异常是一个好主意。否则线程死亡,并且池必须启动一个新线程来替换它。这基本上就是评论中链接的文章所说的内容。
答案 1 :(得分:0)
您应该保留Future的返回值
并使用Future.get()询问是否存在未处理的异常