Sobes.tech
Middle

Cum funcționează Executorii în Java?

sobes.tech AI

Răspuns de la AI

Executor — este o interfață în Java care definește un contract pentru executarea sarcinilor într-un pool de fire. În loc să creați explicit fire pentru fiecare sarcină, trimiteți sarcinile executorilor, care gestionează crearea, utilizarea și distrugerea firelor.

Principalele avantaje:

  • Gestionarea firelor: Oferă o metodă unificată de gestionare a pool-ului de fire, evitând crearea și sincronizarea manuală a firelor.
  • Eficiență: Reutilizează firele existente, reducând costurile de creare și distrugere a firelor.
  • Performanță: Îmbunătățește performanța și capacitatea de răspuns a aplicațiilor prin executarea asincronă a sarcinilor.

Executor are o metodă:

// Execută comanda dată la un moment dat în viitor.
void execute(Runnable command);

Subtipuri frecvent utilizate:

  • ExecutorService: Extinde Executor și oferă metode suplimentare pentru gestionarea ciclului de viață al executorului și obținerea rezultatelor sarcinilor (de exemplu, prin Future).
  • ScheduledExecutorService: Extinde ExecutorService și permite executarea sarcinilor cu întârziere sau după un program.

Clasa Executors oferă metode de fabrică pentru crearea diferitelor tipuri de executori:

// Creează un pool de fire cu un număr fix de fire.
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

// Creează un pool de fire care poate regla dinamic numărul de fire.
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

// Creează un pool de fire care poate executa sarcini programate.
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

Exemplu de utilizare:

// Obiect executor
ExecutorService executor = Executors.newFixedThreadPool(2);

// Sarcină pentru executare
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Codul sarcinii
        System.out.println("Sarcina se execută în firul: " + Thread.currentThread().getName());
    }
};

// Trimiterea sarcinii către executor
executor.execute(task);

// Închiderea executorului (necesar pentru eliberarea resurselor)
executor.shutdown();

La apelarea execute(), executorul preia sarcina (Runnable) și o atribuie unuia dintre firele sale pentru executare. Gestionarea distribuirii sarcinilor între fire și ciclul de viață al acestora este realizată de executor.