Sobes.tech
Middle

Ako fungujú Executor v Jave?

sobes.tech AI

Odpoveď od AI

Executor je rozhranie v Jave, ktoré definuje zmluvu pre vykonávanie úloh v thread pool. Namiesto explicitného vytvárania vlákien pre každú úlohu, odovzdávate úlohy vykonávateľom, ktorí spravujú vytváranie, používanie a zničenie vlákien.

Hlavné výhody:

  • Správa vlákien: Poskytuje jednotný spôsob správy thread pool, eliminujúc manuálne vytváranie a synchronizáciu vlákien.
  • Efektivita: Opakovane využíva existujúce vlákna, znižujúc režijné náklady na ich vytváranie a zničenie.
  • Výkon: Zlepšuje výkon a odozvu aplikácií prostredníctvom asynchrónneho vykonávania úloh.

Executor má jednu metódu:

// Vykonáva daný príkaz v budúcnosti.
void execute(Runnable command);

Často sa používajú podtypy:

  • ExecutorService: rozširuje Executor a poskytuje ďalšie metódy na správu životného cyklu vykonávateľa a získavanie výsledkov vykonávania úloh (napríklad cez Future).
  • ScheduledExecutorService: rozširuje ExecutorService a umožňuje vykonávať úlohy s oneskorením alebo podľa rozvrhu.

Trieda Executors poskytuje továrenské metódy na vytváranie rôznych typov vykonávateľov:

// Vytvára thread pool s pevne stanoveným počtom vlákien.
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

// Vytvára thread pool, ktorý môže dynamicky upravovať počet vlákien.
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

// Vytvára thread pool, ktorý môže vykonávať úlohy podľa rozvrhu.
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

Príklad použitia:

// Objekt vykonávateľa
ExecutorService executor = Executors.newFixedThreadPool(2);

// Úloha na vykonanie
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Kód úlohy
        System.out.println("Vykonáva sa úloha v vlákne: " + Thread.currentThread().getName());
    }
};

// Odovzdanie úlohy vykonávateľovi
executor.execute(task);

// Ukončenie práce vykonávateľa (nevyhnutné na uvoľnenie zdrojov)
executor.shutdown();

Pri volaní execute(), vykonávateľ vezme úlohu (Runnable) a odovzdá ju jednému z vlákien vo svojom poole na vykonanie. Správa rozdeľovania úloh medzi vláknami a ich životným cyklom je na ňom.