Uvod
U svijetu programiranja ฤesto postoji potreba za izvoฤenjem odreฤenog bloka koda opetovano u odreฤenim vremenskim intervalima. JavaScript ima ugraฤenu funkciju pod nazivom `setInterval()` koja sluลพi u tu svrhu. Meฤutim, u Javi ne postoji izravni ekvivalent JavaScript `setInterval()`. U ovom ฤemo ฤlanku istraลพiti rjeลกenje za implementaciju ekvivalenta setInterval u Javi i zaroniti u objaลกnjenja koda korak po korak. Takoฤer ฤemo raspravljati o relevantnim knjiลพnicama i funkcijama ukljuฤenim u rjeลกavanje ovog problema.
ExecutorService i ScheduledExecutorService
Java pruลพa Izvrลกiteljska sluลพba i ScheduledExecutorService suฤelja u java.util.concurrent paket, koji se moลพe koristiti za postizanje funkcionalnosti sliฤne JavaScriptovom `setInterval()`. The Izvrลกiteljska sluลพba koristi se za asinkrono izvrลกavanje zadataka, dok ScheduledExecutorService suฤelje, koje se proteลพe Izvrลกiteljska sluลพba, posebno je dizajniran za izvrลกavanje zadataka u fiksnim intervalima ili odgodama.
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 razrede za izradu planiranih zadataka i rad s njima.
โ`java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
"`
2. Stvorite instancu ScheduledExecutorService:
Stvorite novu instancu ScheduledExecutorService koristeฤi `Executors.newScheduledThreadPool()` s brojem niti kao argumentom. U ovom sluฤaju koristimo samo jednu nit.
โ`java
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
"`
3. Definirajte zadatak:
Definirajte a Izvodljivo zadatak koji sadrลพi blok koda koji se ponavlja. Ovdje samo ispisujemo trenutno vrijeme u milisekundama.
โ`java
Zadatak koji se moลพe izvoditi = () -> {
System.out.println(โZadatak izvrลกen u: โ + System.currentTimeMillis());
};
"`
4. Zakaลพite zadatak:
Koristite metodu `scheduleAtFixedRate()` koju pruลพa ScheduledExecutorService za raspored izvrลกenja zadatka u fiksnim intervalima. Potrebna su ฤetiri argumenta:
โ Zadatak koji treba izvrลกiti (Runnable)
โ Poฤetna odgoda prije prvog izvrลกenja (dugo)
โ Kaลกnjenje izmeฤu izvrลกenja zadatka (dugo)
โ Jedinica vremena za prethodna dva argumenta (TimeUnit)
โ`java
scheduler.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS);
"`
U gornjem kodu, zadatak ฤe se odmah izvrลกiti (s poฤetnim kaลกnjenjem od 0) i ponoviti svake 2 sekunde.
Timer i TimerTask
Druga alternativa za postizanje funkcionalnosti `setInterval()` u Javi je koriลกtenje Odbrojavanje i Zadatak odbrojavanja klase. The Odbrojavanje klasa pruลพa metode za planiranje zadataka za buduฤe izvrลกavanje u fiksnim intervalima, dok Zadatak odbrojavanja je apstraktna klasa koju biste trebali proลกiriti da biste stvorili 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); } }
Oboje ScheduledExecutorService i Odbrojavanje korisni su za implementaciju ekvivalenta setInterval. Meฤutim, opฤenito se preporuฤuje koriลกtenje ScheduledExecutorService zbog svojih dodatnih znaฤajki i fleksibilnosti, kao ลกto je rukovanje s viลกe zadataka ili dopuลกtanje otkazivanja zadataka.