Sobes.tech
Junior

Čo je to vláknový bazén?

sobes.tech AI

Odpoveď od AI

ThreadPool (vlákno bazén) je skupina pracovných vlákien riadených jednotnou entitou, ktorá prijíma úlohy a rozdeľuje ich medzi dostupné vlákna. Namiesto vytvárania nového vlákna pre každú úlohu, bazén ich znovu využíva.

Hlavné výhody:

  • Zníženie režijných nákladov: Vytváranie a ničenie vlákien je časovo a zdrojovo náročné. Bazén to odstraňuje.
  • Správa zdrojov: Obmedzuje maximálny počet súčasne bežiacich vlákien, čím predchádza vyčerpaniu systémových zdrojov.
  • Zlepšenie výkonu: Riadi front úloh, čo môže zvýšiť priepustnosť aplikácií.
  • Jednoduché riadenie: Poskytuje centralizovaný mechanizmus na vykonávanie asynchrónnych úloh.

V Jave sa na prácu s bazénmi vlákien používa balík java.util.concurrent. Hlavné rozhrania a triedy:

  • Executor: Rozhranie na vykonávanie úloh.
  • ExecutorService: Rozšírenie Executor, ktoré poskytuje metódy na správu životného cyklu bazénu a získavanie výsledkov.
  • Executors: Pomocná trieda na vytváranie štandardných implementácií ExecutorService, napríklad:
    • newFixedThreadPool(int nThreads): Bazén s pevne stanoveným počtom vlákien.
    • newCachedThreadPool(): Bazén, ktorý vytvára vlákna podľa potreby a znovu využíva neaktívne.
    • newSingleThreadExecutor(): Bazén s jedným pracovným vláknom.
    • newScheduledThreadPool(int corePoolSize): Bazén na plánované vykonávanie úloh.
  • ThreadPoolExecutor: Flexibilná implementácia ExecutorService, ktorá umožňuje jemnejšie nastavovanie správania bazénu.

Príklad použitia ExecutorService:

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

// Príklad úlohy na vykonanie v bazéne
class MyTask implements Runnable {
    private final int taskId;

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

    @Override
    public void run() {
        System.out.println("Vykonávam úlohu " + taskId + " vlákno " + Thread.currentThread().getName());
        try {
            Thread.sleep(100); // Napodobenie práce
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

public class ThreadPoolExample {
    public static void main(String[] args) {
        // Vytvorenie bazénu s pevným počtom vlákien
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        // Odoslanie úloh na vykonanie
        for (int i = 0; i < 10; i++) {
            executorService.submit(new MyTask(i));
        }

        // Správne ukončenie práce bazénu po dokončení všetkých úloh
        executorService.shutdown();
    }
}

Životný cyklus bazénu je riadený metódami shutdown() a shutdownNow() pre jeho správne ukončenie.