Sobes.tech
Junior

Co je to vláknový bazén?

sobes.tech AI

Odpověď od AI

ThreadPool (vlákno bazén) je skupina pracovních vláken řízených jednotnou entitou, která přijímá úkoly a rozděluje je mezi dostupná vlákna. Místo vytváření nového vlákna pro každý úkol, bazén je znovu používá.

Hlavní výhody:

  • Snížení režijních nákladů: Vytváření a ničení vláken je časově a zdrojově náročné. Bazén to odstraňuje.
  • Správa zdrojů: Omezuje maximální počet současně běžících vláken, čímž předchází vyčerpání systémových zdrojů.
  • Zlepšení výkonu: Řídí frontu úkolů, což může zvýšit propustnost aplikací.
  • Snadná správa: Poskytuje centralizovaný mechanismus pro asynchronní vykonávání úkolů.

V jazyce Java se pro práci s vlákny používá balíček java.util.concurrent. Hlavní rozhraní a třídy:

  • Executor: Rozhraní pro vykonávání úkolů.
  • ExecutorService: Rozšíření Executor, které poskytuje metody pro správu životního cyklu bazénu a získávání výsledků.
  • Executors: Pomocná třída pro vytváření standardních implementací ExecutorService, například:
    • newFixedThreadPool(int nThreads): Bazén s pevně stanoveným počtem vláken.
    • newCachedThreadPool(): Bazén, který vytváří vlákna podle potřeby a znovu používá neaktivní.
    • newSingleThreadExecutor(): Bazén s jedním pracovním vláknem.
    • newScheduledThreadPool(int corePoolSize): Bazén pro plánované vykonávání úkolů.
  • ThreadPoolExecutor: Flexibilní implementace ExecutorService, umožňující jemnější nastavení chování bazénu.

Příklad použití ExecutorService:

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

// Příklad úkolu pro vykonání v bazénu
class MyTask implements Runnable {
    private final int taskId;

    public MyTask(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("Vykonávám úkol " + taskId + " vláknem " + Thread.currentThread().getName());
        try {
            Thread.sleep(100); // Napodobení práce
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

public class ThreadPoolExample {
    public static void main(String[] args) {
        // Vytvoření bazénu s pevným počtem vláken
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        // Odeslání úkolů k vykonání
        for (int i = 0; i < 10; i++) {
            executorService.submit(new MyTask(i));
        }

        // Správné ukončení práce bazénu po dokončení všech úkolů
        executorService.shutdown();
    }
}

Životní cyklus bazénu je řízen metodami shutdown() a shutdownNow() pro jeho správné ukončení.