Sobes.tech
Middle

Kako funkcionišu Executor u Javi?

sobes.tech АИ

Одговор од АИ

Executor — то интерфејс у Јави који дефинише уговор за извршавање задатака у пулу нитеи. Уместо јасног креирања нитеи за сваки задатак, преносите задатке извршитељима, а они управљају креирањем, коришћењем и уништавањем нитеи.

Главне предности:

  • Управљање нитеи: Обезбеђује јединствен начин управљања пулом нитеи, елиминишући ручно креирање и синхронизацију нитеи.
  • Ефикасност: Поново користи постојеће нитеи, смањујући трошкове креирања и уништавања нитеи.
  • Перформансе: Побољшава перформансе и одзивност апликација кроз асинхроно извршавање задатака.

Executor има једну методу:

// Извршава ову команду у неком будућем тренутку.
void execute(Runnable command);

Често се користе подтипови:

  • ExecutorService: проширује Executor и пружа додатне методе за управљање животним циклусом извршитеља и добијање резултата извршавања задатака (нпр. преко Future).
  • ScheduledExecutorService: проширује ExecutorService и омогућава извршавање задатака са закашњењем или по распореду.

Класа Executors пружа фабричке методе за креирање различитих типова извршитеља:

// Креира пул нитеи са фиксним бројем нитеи.
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

// Креира пул нитеи који може динамички регулисати број нитеи.
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

// Креира пул нитеи који може извршавати задатке по распореду.
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

Пример коришћења:

// Објекат извршитеља
ExecutorService executor = Executors.newFixedThreadPool(2);

// Задатак за извршавање
Runnable task = new Runnable() {
    @Override
    public void run() {
        // Код задатка
        System.out.println("Извршава се задатак у потоку: " + Thread.currentThread().getName());
    }
};

// Пренос задатка извршитељу
executor.execute(task);

// Завршетак рада извршитеља (неопходно за ослобађање ресурса)
executor.shutdown();

При позиву execute(), извршитељ узима задатак (Runnable) и преноси га једном од поткова у свом пулу на извршавање. Управљање расподелом задатака међу потковима и њиховим животним циклусом преузима извршитељ.