В света на програмирането често има нужда да се изпълнява определен блок код многократно на определени интервали от време. JavaScript има вградена функция, наречена `setInterval()`, която служи за тази цел. В Java обаче няма пряк еквивалент на JavaScript `setInterval()`. В тази статия ще проучим решение за прилагане на еквивалента на setInterval в Java и ще се потопим в обяснения стъпка по стъпка на кода. Ще обсъдим и съответните библиотеки и функции, участващи в решаването на този проблем.
ExecutorService и ScheduledExecutorService
Java предоставя интерфейсите ExecutorService и ScheduledExecutorService в пакета java.util.concurrent , които могат да се използват за постигане на функционалност, подобна на JavaScript `setInterval()`. ExecutorService се използва за асинхронно изпълнение на задачи, докато интерфейсът ScheduledExecutorService , който разширява ExecutorService , е специално проектиран за изпълнение на задачи през фиксирани интервали или закъснения.
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);
}
}
Стъпка по стъпка обяснение на кода
1. Импортирайте необходимите класове:
Първо импортирайте необходимите класове за създаване и работа с планирани задачи.
„`java
импортиране на java.util.concurrent.Executors;
импортиране на java.util.concurrent.ScheduledExecutorService;
импортиране java.util.concurrent.TimeUnit;
„„
2. Създайте екземпляр на ScheduledExecutorService:
Създайте нов екземпляр на ScheduledExecutorService използвайки `Executors.newScheduledThreadPool()` с броя на нишките като аргумент. В този случай използваме само една нишка.
„`java
Планировчик на ScheduledExecutorService = Executors.newScheduledThreadPool(1);
„„
3. Дефинирайте задачата:
Определете a Изпълним задача, която съдържа кодовия блок, който трябва да се изпълнява многократно. Тук просто отпечатваме текущото време в милисекунди.
„`java
Изпълнима задача = () -> {
System.out.println(“Задачата е изпълнена в: ” + System.currentTimeMillis());
};
„„
4. Планирайте задачата:
Използвайте метода `scheduleAtFixedRate()`, предоставен от ScheduledExecutorService да планирате изпълнението на задачата на фиксирани интервали. Необходими са четири аргумента:
– Задачата за изпълнение (Runnable)
– Първоначалното забавяне преди първото изпълнение (дълго)
– Забавянето между изпълнението на задачите (дълго)
– Единицата време за предишните два аргумента (TimeUnit)
„`java
scheduler.scheduleAtFixedRate(задача, 0, 2, TimeUnit.СЕКУНДИ);
„„
В горния код задачата ще бъде изпълнена незабавно (с първоначално забавяне от 0) и ще се повтаря на всеки 2 секунди.
Таймер и TimerTask
Друга алтернатива за постигане на функционалността `setInterval()` в Java е използването на класовете Timer и TimerTask . Класът Timer предоставя методи за планиране на задачи за бъдещо изпълнение през фиксирани интервали, докато TimerTask е абстрактен клас, който трябва да разширите, за да създадете необходимата задача.
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);
}
}
Както ScheduledExecutorService , така и Timer са полезни за имплементиране на еквивалента на setInterval. Въпреки това, като цяло се препоръчва използването на ScheduledExecutorService поради допълнителните му функции и гъвкавост, като например обработка на множество задачи или позволяване на отмяна на задачи.