Ve svฤtฤ programovรกnรญ je ฤasto potลeba provรกdฤt konkrรฉtnรญ blok kรณdu opakovanฤ ve stanovenรฝch ฤasovรฝch intervalech. JavaScript mรก vestavฤnou funkci nazvanou `setInterval()`, kterรก slouลพรญ tomuto รบฤelu. V Javฤ vลกak neexistuje pลรญmรฝ ekvivalent k JavaScriptu `setInterval()`. V tomto ฤlรกnku prozkoumรกme ลeลกenรญ implementace ekvivalentu setInterval v Javฤ a ponoลรญme se do podrobnรฉho vysvฤtlenรญ kรณdu. Probereme takรฉ pลรญsluลกnรฉ knihovny a funkce zapojenรฉ do ลeลกenรญ tohoto problรฉmu.
ExecutorService a ScheduledExecutorService
Java poskytuje ExekutorService si ScheduledExecutorService rozhranรญ v java.util.concurrent balรญฤek, kterรฝ lze pouลพรญt k dosaลพenรญ funkcรญ podobnรฝch JavaScriptu `setInterval()`. The ExekutorService se pouลพรญvรก pro provรกdฤnรญ รบloh asynchronnฤ, zatรญmco ScheduledExecutorService rozhranรญ, kterรฉ rozลกiลuje ExekutorService, je speciรกlnฤ navrลพen pro provรกdฤnรญ รบkolลฏ v pevnรฝch intervalech nebo zpoลพdฤnรญch.
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class SetIntervalEquivalent { public static void main(String[] args) { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); Runnable task = () -> { System.out.println("Task executed at: " + System.currentTimeMillis()); }; scheduler.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS); } }
Vysvฤtlenรญ kรณdu krok za krokem
1. Importujte poลพadovanรฉ tลรญdy:
Nejprve importujte potลebnรฉ tลรญdy k vytvoลenรญ a prรกci s naplรกnovanรฝmi รบlohami.
"Jรกva."
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
"."
2. Vytvoลte instanci ScheduledExecutorService:
Vytvoลte novou instanci ScheduledExecutorService pomocรญ `Executors.newScheduledThreadPool()` s poฤtem vlรกken jako argumentem. V tomto pลรญpadฤ pouลพijeme pouze jedno vlรกkno.
"Jรกva."
Plรกnovaฤ ScheduledExecutorService = Executors.newScheduledThreadPool(1);
"."
3. Definujte รบkol:
Definujte a Spustitelnรฝ รบloha, kterรก obsahuje blok kรณdu, kterรฝ se mรก provรกdฤt opakovanฤ. Zde pouze tiskneme aktuรกlnรญ ฤas v milisekundรกch.
"Jรกva."
Spustitelnรก รบloha = () -> {
System.out.println(โรloha provedena v: โ + System.currentTimeMillis());
};
"."
4. Naplรกnujte si รบkol:
Pouลพijte metodu `scheduleAtFixedRate()` poskytovanou ScheduledExecutorService naplรกnovat provรกdฤnรญ รบlohy v pevnรฝch intervalech. Chce to ฤtyลi argumenty:
โ รloha, kterรก mรก bรฝt provedena (spustitelnรก)
โ Poฤรกteฤnรญ zpoลพdฤnรญ pลed prvnรญm provedenรญm (dlouhรฉ)
โ Prodleva mezi provedenรญm รบlohy (dlouhรก)
โ Jednotka ฤasu pro pลedchozรญ dva argumenty (TimeUnit)
"Jรกva."
scheduler.scheduleAtFixedRate(รบloha, 0, 2, TimeUnit.SECONDS);
"."
Ve vรฝลกe uvedenรฉm kรณdu bude รบloha provedena okamลพitฤ (s poฤรกteฤnรญm zpoลพdฤnรญm 0) a opakovรกna kaลพdรฉ 2 sekundy.
Timer a TimerTask
Dalลกรญ alternativou k dosaลพenรญ funkce `setInterval()` v Javฤ je pouลพitรญ ฤasovaฤ si รkol ฤasovaฤe tลรญdy. The ฤasovaฤ tลรญda poskytuje metody pro plรกnovรกnรญ รบloh pro budoucรญ provรกdฤnรญ v pevnรฝch intervalech, zatรญmco รkol ฤasovaฤe je abstraktnรญ tลรญda, kterou byste mฤli rozลกรญลit, abyste vytvoลili poลพadovanou รบlohu.
import java.util.Timer; import java.util.TimerTask; public class SetIntervalEquivalentAlternative { public static void main(String[] args) { Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { System.out.println("Task executed at: " + System.currentTimeMillis()); } }; timer.scheduleAtFixedRate(task, 0, 2000); } }
Oba ScheduledExecutorService si ฤasovaฤ jsou uลพiteฤnรฉ pro implementaci ekvivalentu setInterval. Obecnฤ se vลกak doporuฤuje pouลพรญvat ScheduledExecutorService dรญky svรฝm dodateฤnรฝm funkcรญm a flexibilitฤ, jako je zpracovรกnรญ vรญce รบkolลฏ nebo umoลพnฤnรญ zruลกenรญ รบkolลฏ.