"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How to Properly Shut Down Java ExecutorService Executors?

How to Properly Shut Down Java ExecutorService Executors?

Published on 2024-11-10
Browse:236

How to Properly Shut Down Java ExecutorService Executors?

Gracefully Shutting Down Java ExecutorService

Executors are a convenient way to manage and execute tasks concurrently in Java applications. However, improper shutdown can lead to unexpected behavior or performance issues. This guide provides a detailed explanation of how to properly shut down anExecutorService, ensuring that all tasks are terminated or canceled.

Understanding ExecutorService Shutdown

ExecutorService offers two primary shutdown methods:

  • shutdown(): Prevents new tasks from being submitted while allowing existing tasks to complete.
  • shutdownNow(): Attempts to stop all executing and waiting tasks, returning a list of unprocessed tasks.

It's important to note that shutdown is not guaranteed to terminate all tasks. Tasks that fail to respond to interrupts or have long-running operations may remain active.

Recommended Shutdown Procedure

The Oracle documentation suggests the following approach for a graceful shutdown:

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();
    }
}

This approach ensures that existing tasks are allowed to finish while preventing new submissions. If the shutdown process takes longer than expected, you can replace

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

with

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

to continue waiting for task completion.

Summary of Shutdown Methods

  • shutdown(): Stops accepting new tasks but allows existing tasks to complete.
  • shutdownNow(): Halts all executing and waiting tasks, returning unprocessed tasks.
  • awaitTermination(long timeout, TimeUnit unit): Blocks until all tasks are completed, the timeout occurs, or the current thread is interrupted.
Release Statement This article is reproduced at: 1729725790 If there is any infringement, please contact [email protected] to delete it
Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3