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.