ExecutorService.close în Java

Oprește executorul și așteaptă să se termine toate sarcinile; permite folosirea executorului în try-with-resources.

Sintaxă
default void close()

try (ExecutorService executor = Executors.newFixedThreadPool(4)) {
    // trimiți sarcini
} // aici close() așteaptă toate sarcinile

Ce face ExecutorService.close

Din Java 19, ExecutorService extinde AutoCloseable. Metoda close() face trei lucruri: apelează shutdown(), așteaptă până se termină toate sarcinile trimise și abia apoi revine.

Asta înseamnă că poți scrie executorul într-un bloc try (...) { }. La ieșirea din bloc, toate sarcinile sunt terminate, chiar dacă în bloc a apărut o excepție. Nu mai ai nevoie de perechea shutdown() + awaitTermination().

Dacă firul care așteaptă în close() este întrerupt, executorul apelează shutdownNow() și încearcă să oprească sarcinile.

Ce returnează

Nimic (void). Când revine, toate sarcinile s-au terminat.

Exemple

Exemplul 1: Executor în try-with-resources

După blocul try, toate cele patru sarcini s-au terminat, deci totalul este complet.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        int[] vanzari = {120, 340, 75, 260};
        AtomicInteger total = new AtomicInteger();
        try (ExecutorService executor = Executors.newFixedThreadPool(2)) {
            for (int v : vanzari) {
                executor.submit(() -> total.addAndGet(v));
            }
        }
        System.out.println("Total vânzări: " + total.get() + " lei");
    }
}

Rezultat

Total vânzări: 795 lei

Exemplul 2: close() așteaptă și sarcinile lente

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        try (executor) {
            executor.submit(() -> {
                Thread.sleep(300);
                System.out.println("Copia de siguranță s-a terminat");
                return null;
            });
            System.out.println("Sarcina a fost trimisă");
        }
        System.out.println("Executor închis: " + executor.isTerminated());
    }
}

Rezultat

Sarcina a fost trimisă
Copia de siguranță s-a terminat
Executor închis: true

Greșeli frecvente

  • Folosești close() pe JDK mai vechi de 19. Nu compilează; acolo scrii shutdown() și awaitTermination().
  • Închizi în try un executor pe care vrei să-l refolosești mai târziu. După close() respinge orice sarcină nouă.

Comenzi înrudite

  • ExecutorService: Un grup de fire de execuție care primește sarcini și le rulează; se oprește cu shutdown() și se așteaptă cu awaitTermination().
  • Executors: Clasa cu metode statice care creează executori: cu număr fix de fire, cu un singur fir, cu fire virtuale sau programate.
  • Executors.newVirtualThreadPerTaskExecutor: Creează un executor care pornește un fir virtual nou pentru fiecare sarcină; potrivit pentru mii de sarcini care așteaptă.