«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как правильно завершить работу исполнителей Java ExecutorService?

Как правильно завершить работу исполнителей Java ExecutorService?

Опубликовано 10 ноября 2024 г.
Просматривать:386

How to Properly Shut Down Java ExecutorService Executors?

Надежное завершение работы Java ExecutorService

Исполнители — это удобный способ управления и одновременного выполнения задач в приложениях Java. Однако неправильное завершение работы может привести к неожиданному поведению или проблемам с производительностью. В этом руководстве содержится подробное объяснение того, как правильно завершить работу службы ExecutorService, гарантируя, что все задачи будут завершены или отменены.

Понимание завершения работы ExecutorService

ExecutorService предлагает два основных метода завершения работы. :

  • shutdown(): предотвращает отправку новых задач, позволяя выполнить существующие задачи.
  • shutdownNow(): попытки чтобы остановить все выполняемые и ожидающие задачи, возвращая список необработанных задач.

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

Рекомендуемая процедура завершения работы

В документации Oracle предлагается следующий подход для корректного завершения работы:

void shutdownAndAwaitTermination(ExecutorService pool) {
    pool.shutdown();
    try {
        // Wait for existing tasks to terminate
        if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
            pool.shutdownNow();
            // Wait for tasks to respond to cancellation
            if (!pool.awaitTermination(60, TimeUnit.SECONDS))
                System.err.println("Pool did not terminate");
        }
    } catch (InterruptedException ie) {
        pool.shutdownNow();
        Thread.currentThread().interrupt();
    }
}

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

if (!pool.awaitTermination(60, TimeUnit.SECONDS))

на

while (!pool.awaitTermination(60, TimeUnit.SECONDS))

чтобы продолжить ожидание завершения задачи.

Сводка методов завершения работы

  • shutdown(): прекращает принимать новые задачи, но позволяет завершить существующие задачи.
  • shutdownNow(): останавливает все выполняемые и ожидающие задачи, возвращая необработанные задачи .
  • awaitTermination(long timeout, единица измерения TimeUnit): блокируется до тех пор, пока все задачи не будут завершены, не истечет время ожидания или текущий поток не будет прерван.
Заявление о выпуске Эта статья воспроизведена по адресу: 1729725790. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3