U svijetu programiranja, ฤesto postoji potreba da se odreฤeni blok koda izvrลกava uzastopno u odreฤenim vremenskim intervalima. JavaScript ima ugraฤenu funkciju pod nazivom `setInterval()` koja sluลพi ovoj svrsi. Meฤutim, u Javi ne postoji direktan ekvivalent JavaScriptu `setInterval()`. U ovom ฤlanku ฤemo istraลพiti rjeลกenje za implementaciju ekvivalenta setInterval u Javi i uroniti u objaลกnjenja koda korak po korak. Takoฤer ฤemo razgovarati o relevantnim bibliotekama i funkcijama ukljuฤenim u rjeลกavanje ovog problema.
ExecutorService i ScheduledExecutorService
Java pruลพa ExecutorService i ScheduledExecutorService interfejsa u java.util.concurrent paket, koji se moลพe koristiti za postizanje funkcionalnosti sliฤne JavaScript-ovom `setInterval()`. The ExecutorService se koristi za asinhrono izvrลกavanje zadataka, dok se ScheduledExecutorService interfejs, koji se proลกiruje ExecutorService, posebno je dizajniran za izvrลกavanje zadataka u fiksnim intervalima ili kaลกnjenjima.
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); } }
Korak po korak objaลกnjenje koda
1. Uvezite potrebne klase:
Prvo uvezite potrebne klase za kreiranje i rad s planiranim zadacima.
โ`java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
"`
2. Kreirajte instancu ScheduledExecutorService:
Kreirajte novu instancu ScheduledExecutorService koristeฤi `Executors.newScheduledThreadPool()` s brojem niti kao argumentom. U ovom sluฤaju koristimo samo jednu nit.
โ`java
ScheduledExecutorService planer = Executors.newScheduledThreadPool(1);
"`
3. Definirajte zadatak:
Definiลกite a Runnable zadatak koji sadrลพi blok koda koji treba ponavljati. Ovdje samo ispisujemo trenutno vrijeme u milisekundama.
โ`java
Zadatak koji se moลพe pokrenuti = () -> {
System.out.println(โZadatak izvrลกen u: โ + System.currentTimeMillis());
};
"`
4. Rasporedite zadatak:
Koristite metodu `scheduleAtFixedRate()` koju daje ScheduledExecutorService za planiranje izvrลกavanja zadatka u fiksnim intervalima. Potrebna su ฤetiri argumenta:
โ Zadatak koji treba izvrลกiti (izvrลกiti)
โ Poฤetno kaลกnjenje prije prvog izvrลกenja (dugo)
โ Kaลกnjenje izmeฤu izvrลกavanja zadataka (dugo)
โ Jedinica vremena za prethodna dva argumenta (TimeUnit)
โ`java
scheduler.scheduleAtFixedRate(zadatak, 0, 2, TimeUnit.SECONDS);
"`
U gornjem kodu, zadatak ฤe se izvrลกiti odmah (sa poฤetnim kaลกnjenjem od 0) i ponavljati svake 2 sekunde.
Tajmer i TajmerTask
Druga alternativa za postizanje funkcionalnosti `setInterval()` u Javi je koriลกtenje Timer i TimerTask casovi. The Timer class pruลพa metode za planiranje zadataka za buduฤe izvrลกavanje u fiksnim intervalima, dok TimerTask je apstraktna klasa koju biste trebali proลกiriti da kreirate traลพeni zadatak.
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 i Timer korisni su za implementaciju setInterval ekvivalenta. Meฤutim, opฤenito se preporuฤuje koriลกtenje ScheduledExecutorService zbog njegovih dodatnih funkcija i fleksibilnosti, kao ลกto je rukovanje viลกe zadataka ili omoguฤavanje otkazivanja zadataka.