Inhaltsverzeichnis
Geplante Aufgaben-Framework
TimeTask
ScheduledExecutorService
Spring Task
Heim Java javaLernprogramm So implementieren Sie geplante Aufgaben in einer eigenständigen Java-Umgebung

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

Apr 18, 2023 pm 12:16 PM
java

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());
    }
Nach dem Login kopieren

Laufergebnis:

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

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);
    }
Nach dem Login kopieren

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()));
    }
}
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

See all articles