Heim  >  Artikel  >  Java  >  So implementieren Sie geplante Aufgaben in einer eigenständigen Java-Umgebung

So implementieren Sie geplante Aufgaben in einer eigenständigen Java-Umgebung

王林
王林nach vorne
2023-04-18 12:16:031291Durchsuche

Geplante Aufgaben-Framework

So implementieren Sie geplante Aufgaben in einer eigenständigen Java-Umgebung

TimeTask

Seit wir mit dem Erlernen von Java begonnen haben, wurde TimeTask erstmals zum Implementieren geplanter Aufgaben verwendet. Es handelt sich um eine Priorität, die auf der Implementierung eines minimalen Heaps basiert. Level-Warteschlange. TaskQueue sortiert die Aufgaben nach dem Abstand zwischen den Aufgaben und der nächsten Ausführungszeit und stellt so sicher, dass die Aufgaben oben auf dem Heap zuerst ausgeführt werden.

Beispielcode:

 public static void main(String[] args)
    {
          TimerTask task = new TimerTask() {
              public void run() {
                  System.out.println("当前时间: " + new Date() + "n" +
                          "线程名称: " + Thread.currentThread().getName());
              }
          };
          Timer timer = new Timer("Timer");
          long delay = 5000L;
          timer.schedule(task, delay);
          System.out.println("当前时间: " + new Date() + "n" +
                  "线程名称: " + Thread.currentThread().getName());
    }

Laufergebnis:

当前时间: Wed Apr 06 22:05:04 CST 2022n线程名称: main
当前时间: Wed Apr 06 22:05:09 CST 2022n线程名称: Timer

Wie aus den Ergebnissen ersichtlich ist, wurde die geplante Aufgabe nach 5 Sekunden ausgeführt.

Nachteile:

  • TimeTask-Ausführungsaufgaben können nur seriell ausgeführt werden. Sobald die Ausführung einer Aufgabe lange dauert, wirkt sich dies auf die Ausführung anderer Aufgaben aus.

  • Wenn während der Aufgabenausführung eine Ausnahme auftritt, wird die Die Aufgabe wird sofort gestoppt.

Mit der Zeit wird die Java-Technologie ständig aktualisiert. Als Reaktion auf die Mängel von TimeTask scheint ScheduledExecutorService TimeTask zu ersetzen.

ScheduledExecutorService

ScheduledExecutorService ist eine Schnittstelle mit mehreren Implementierungsklassen. Die am häufigsten verwendete ist ScheduledThreadPoolExecutor. Der ScheduledThreadPoolExecutor selbst ist ein Thread-Pool, der DelayQueue intern als Aufgabenwarteschlange verwendet und die gleichzeitige Ausführung von Aufgaben unterstützt.

Beispielcode:

 public static void main(String[] args) throws InterruptedException
   {
      ScheduledExecutorService executorService =
              Executors.newScheduledThreadPool(3);
      // 执行任务: 每 10秒执行一次
      executorService.scheduleAtFixedRate(() -> {
          System.out.println("执行任务:" + new Date()+",线程名称: " + Thread.currentThread().getName());
      }, 1, 10, TimeUnit.SECONDS);
    }

Nachteile:

  • Vermeiden Sie die Verwendung von Executoren zum Erstellen eines Thread-Pools, da die intern im Thread-Pool von JDK verwendete Warteschlange relativ groß ist und OOM anfällig ist .

  • Geplante Aufgaben basieren auf dem eigenständigen JVM-Speicher. Sobald die geplante Aufgabe neu gestartet wird, verschwindet sie.

  • kann Cron-Ausdrücke nicht unterstützen, um umfangreiche geplante Aufgaben zu implementieren.

Spring Task

Nachdem ich Spring kennengelernt hatte, begann ich, Springs eigene Task zu verwenden. Spring Framework enthält geplante Aufgaben und stellt Cron-Ausdrücke zur Implementierung umfangreicher geplanter Aufgabenkonfigurationen bereit.

Beispielcode:

@EnableScheduling
@Component
public class SpringTask
{
    private Logger logger = LoggerFactory.getLogger(SpringTask.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
            "HH:mm:ss");
    /**
     * fixedRate:固定速率执行。每5秒执行一次。
     */
    @Scheduled(fixedRate = 5000)
    public void invokeTaskWithFixedRate()
    {
        logger.info("Fixed Rate Task :  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * fixedDelay:固定延迟执行。距离上一次调用成功后2秒才执。
     */
    @Scheduled(fixedDelay = 2000)
    public void invokeTaskWithFixedDelay()
    {
        try
        {
            TimeUnit.SECONDS.sleep(3);
            logger.info("Fixed Delay Task : Current Time  is  {}",
                    dateFormat.format(new Date()));
        }
        catch (InterruptedException e)
        {
            logger.error("invoke task error",e);
        }
    }
    /**
     * initialDelay:初始延迟。任务的第一次执行将延迟5秒,然后将以5秒的固定间隔执行。
     */
    @Scheduled(initialDelay = 5000, fixedRate = 5000)
    public void invokeTaskWithInitialDelay()
    {
        logger.info("Task with Initial Delay : Current Time is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * cron:使用Cron表达式,每隔5秒执行一次
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void invokeTaskWithCronExpression()
    {
        logger.info("Task Cron Expression:  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
}

Ausführungsergebnis:

2022-04-06 23:06:20.945 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task-Cron-Ausdruck: Die aktuelle Zeit ist 23:06:20
2022-04-06 23:06:22.557 INFO 14604 --- [scheduling-1] com.fw.task.SpringTask: Aufgabe mit anfänglicher Verzögerung: Die aktuelle Zeit ist 23:06:22
2022-04-06 23:06:22.557 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask: Aufgabe mit fester Rate: Aktuelle Zeit ist 23:06:22
2022-04-06 23:06 :25.955 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Aufgabe mit behobener Verzögerung: Aktuelle Zeit ist 23:06:25
2022-04-06 23:06:25.955 INFO 14604 --- [ scheduling -1] com.fw.task.SpringTask: Task-Cron-Ausdruck: Aktuelle Zeit ist 23:06:25
2022-04-06 23:06:27.555 INFO 14604 --- [scheduling-1] com.fw.task. SpringTask: Aufgabe mit anfänglicher Verzögerung: Aktuelle Zeit ist 23:06:27
2022-04-06 23:06:27.556 INFO 14604 --- [scheduling-1] com.fw.task.SpringTask: Aufgabe mit fester Rate: Aktuelle Zeit ist 23:06:27

@EnableScheduling muss geplante Aufgaben aktivieren, @Scheduled(cron = "0/5 * * * * ?") konfiguriert die Regeln für geplante Aufgaben. Der Cron-Ausdruck unterstützt umfangreiche Konfigurationen geplanter Aufgaben. Wer damit nicht vertraut ist, kann ihn ausprobieren. Vorteile: Einfach und bequem zu verwenden. Unterstützt verschiedene komplexe Konfigurationen geplanter Aufgaben. Nachteile:

Basierend auf eigenständigen geplanten Aufgaben verschwindet es, sobald die geplante Aufgabe neu gestartet wird.

Geplante Aufgaben sind standardmäßig Single-Threaded-Ausführungsaufgaben. Wenn eine parallele Ausführung erforderlich ist, muss @EnableAsync aktiviert sein.

  • Es gibt kein einheitliches grafisches Aufgabenplanungsmanagement und es ist unmöglich, geplante Aufgaben zu kontrollieren

Das obige ist der detaillierte Inhalt vonSo implementieren Sie geplante Aufgaben in einer eigenständigen Java-Umgebung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen