В приложении часто требуется запускать какую-то конкретную задачу в фоновом режиме, чтобы выполнить некоторую работу с интервалом. Примером может служить служба, работающая в фоновом режиме для очистки приложения, как у нас есть сборка мусора 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 . |