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 scriishutdown()șiawaitTermination(). - Închizi în
tryun 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ă.