Нужно ли обрабатывать исключения в executorservice - PullRequest
0 голосов
/ 07 сентября 2018

Нужно ли обрабатывать исключения во время выполнения в executorservice? Я попробовал пример в весенней загрузке веб-приложения, код все равно будет выполняться, несмотря на исключение

Вот код:

@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 голосов
/ 07 сентября 2018

Когда исключение выдается в одном потоке, оно не распространяется на другие потоки, если вы не сделаете что-то для этого (например, используя Future). Здесь поток вызывает исключение и умирает, но остальная часть программы не затрагивается.

Исполнитель создает замену для потерянного потока, см. API-документ:

Создает Исполнителя, который использует один рабочий поток, работающий из неограниченной очереди, и использует предоставленную ThreadFactory для создания нового потока, когда это необходимо. В отличие от эквивалентного newFixedThreadPool (1, threadFactory) в противном случае возвращаемый исполнитель гарантированно не реконфигурируется для использования дополнительных потоков.

Мне кажется хорошей идеей, чтобы задачи обрабатывали исключения, которые они вызывают. В противном случае поток умирает, и пул должен начать новый, чтобы заменить его. Это в основном то, что говорится в статье в комментариях.

0 голосов
/ 07 сентября 2018

Вы должны сохранить возвращаемое значение Future

и используйте Future.get () для опроса, если было необработанное исключение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...