Статьи

[Java] Как запланировать выполнение задачи в интервале

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