Sobes.tech
Middle

Jak działają Executor w Java?

sobes.tech AI

Odpowiedź od AI

Executor — to interfejs w Javie, który definiuje kontrakt do wykonywania zadań w puli wątków. Zamiast jawnie tworzyć wątki dla każdego zadania, przekazujesz zadania wykonawcom, którzy zarządzają tworzeniem, używaniem i niszczeniem wątków.

Główne zalety:

  • Zarządzanie wątkami: Zapewnia jednolity sposób zarządzania pulą wątków, eliminując ręczne tworzenie i synchronizację wątków.
  • Wydajność: Ponownie wykorzystuje istniejące wątki, zmniejszając koszty związane z tworzeniem i niszczeniem wątków.
  • Wydajność: Poprawia wydajność i responsywność aplikacji dzięki asynchronicznemu wykonywaniu zadań.

Executor ma jedną metodę:

// Wykonuje podane polecenie w przyszłości.
void execute(Runnable command);

Często używane podtypy:

  • ExecutorService: Rozszerza Executor i zapewnia dodatkowe metody do zarządzania cyklem życia wykonawcy i uzyskiwania wyników zadań (np. przez Future).
  • ScheduledExecutorService: Rozszerza ExecutorService i pozwala na wykonywanie zadań z opóźnieniem lub według harmonogramu.

Klasa Executors zapewnia metody fabryczne do tworzenia różnych typów wykonawców:

// Tworzy pulę wątków z ustaloną liczbą wątków.
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

// Tworzy pulę wątków, która może dynamicznie regulować liczbę wątków.
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

// Tworzy pulę wątków, która może wykonywać zadania zgodnie z harmonogramem.
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

Przykład użycia:

// Obiekt wykonawczy
ExecutorService executor = Executors.newFixedThreadPool(2);

// Zadanie do wykonania
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Kod zadania
        System.out.println("Zadanie wykonywane w wątku: " + Thread.currentThread().getName());
    }
};

// Przekazanie zadania wykonawcy
executor.execute(task);

// Zakończenie pracy wykonawcy (konieczne do zwolnienia zasobów)
executor.shutdown();

Po wywołaniu execute(), wykonawca bierze zadanie (Runnable) i przypisuje je do jednego z własnych wątków do wykonania. Zarządzanie rozdziałem zadań między wątki i ich cyklem życia leży po stronie wykonawcy.