В приложении часто требуется запускать какую-то конкретную задачу в фоновом режиме, чтобы выполнить некоторую работу с интервалом. Примером может служить служба, работающая в фоновом режиме для очистки приложения, как у нас есть сборка мусора Java.
В этой статье я покажу вам 3 разных способа достижения этого
Они следующие
- используя простой поток
- используя TimerTask
- используя ScheduledExecutorService
используя простой поток
Это очень просто: создается простой поток, который запускает его навсегда с использованием цикла while, и использует метод sleep для установки интервала между запусками.
Это просто быстрый и быстрый способ добиться этого
Ниже приведен код для этого.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class Task1 {public static void main(String[] args) { // run in a second final long timeInterval = 1000; Runnable runnable = new Runnable() { public void run() { while (true) { // ------- code for task to run System.out.println("Hello !!"); // ------- ends here try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread = new Thread(runnable); thread.start(); }} |
используя Timer и TimerTask
Предыдущий метод, который мы видели, был очень быстрым, но ему не хватает функциональности.
Это имеет гораздо больше преимуществ, чем предыдущие, они заключаются в следующем
- контроль, когда запуск и отмена задачи
- Первое выполнение может быть отложено, если требуется, обеспечивает полезное
В этом мы используем класс Timer для целей планирования, а TimerTask используется для включения задачи, выполняемой внутри метода run ().
Экземпляр таймера может использоваться совместно для планирования нескольких задач и является поточно-ориентированным.
Когда вызывается конструктор Timer, он создает один поток, и этот единственный поток используется для любого планирования задачи.
Для нашей цели мы используем Timer # scheduleAtFixedRate
Следующий код показывает использование Timer и TimerTask
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.Timer;import java.util.TimerTask;public class Task2 { public static void main(String[] args) { TimerTask task = new TimerTask() { @Override public void run() { // task to run goes here System.out.println("Hello !!!"); } }; Timer timer = new Timer(); long delay = 0; long intevalPeriod = 1 * 1000; // schedules the task to be run in an interval timer.scheduleAtFixedRate(task, delay, intevalPeriod); } // end of main} |
Эти классы являются классами, существующими в JDK 1.3.
используя ScheduledExecutorService
Это введено в java.util.concurrent из Java SE 5 как утилиты параллелизма. Это предпочтительный способ достижения цели.
Это обеспечивает следующие преимущества по сравнению с предыдущими решениями
- пул потоков используется для выполнения по сравнению с одиночным потоком TImer
- Обеспечивает гибкость для задержки первого выполнения
- Обеспечивает хорошие соглашения для обеспечения временных интервалов
Следующий код показывает использование того же самого,
В этом мы используем ScheduledExecutorService # scheduleAtFixedRate, как показано, он принимает в качестве параметра runnable, какой конкретный фрагмент кода мы хотим запустить, initialdelay для первого выполнения
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Task3 { public static void main(String[] args) { Runnable runnable = new Runnable() { public void run() { // task to run goes here System.out.println("Hello !!"); } }; ScheduledExecutorService service = Executors .newSingleThreadScheduledExecutor(); service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS); }} |
| Ссылка: | [Java] Как запланировать выполнение задачи с интервалом от нашего партнера JCG Абхиджита Сутара в блоге ajduke . |