我需要在executorservice中处理异常吗

时间:2018-09-06 23:59:54

标签: java spring-boot exception-handling executorservice

我需要在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";
    }
}

2 个答案:

答案 0 :(得分:1)

在一个线程中引发异常时,除非您做出某些操作(例如使用Future),否则该异常不会传播到其他线程。这里的线程导致异常并死亡,但是程序的其余部分不受影响。

执行程序为丢失的线程创建替换项,请参见api文档:

  

创建一个执行程序,该执行程序使用在不受限制的队列上运行的单个工作线程,并在需要时使用提供的ThreadFactory创建新线程。与其他等效的newFixedThreadPool(1,threadFactory)不同,保证返回的执行程序不能重新配置为使用其他线程。

在我看来,让任务处理它们引起的异常是一个好主意。否则线程死亡,并且池必须启动一个新线程来替换它。这基本上就是评论中链接的文章所说的内容。

答案 1 :(得分:0)

您应该保留Future的返回值

并使用Future.get()询问是否存在未处理的异常