Heim  >  Artikel  >  Java  >  Java CountDownLatch vervollständigt die gemeinsame Nutzung des asynchronen Callback-Beispielcodes

Java CountDownLatch vervollständigt die gemeinsame Nutzung des asynchronen Callback-Beispielcodes

黄舟
黄舟Original
2017-03-23 10:29:431774Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur detaillierten Erläuterung der von Java CountDownLatch vervollständigten asynchronen Rückrufinstanz vorgestellt. Freunde, die sie benötigen, können sich auf

Ausführliche Erläuterung der von Java vervollständigten asynchronen Rückrufinstanz beziehen CountDownLatch

Beispielcode:

public class AsyncDemo {

  private static void doSomeTask() {
    System.out.println("Hello World");
  }

  private static void onCompletion() {
    System.out.println("All tasks finished");
  }

  public static void main(String[] args) {
    ExecutorService executor = Executors.newCachedThreadPool();
    final CountDownLatch latch = new CountDownLatch(2);

    executor.execute(new Task(latch));
    executor.execute(new Task(latch));

    executor.execute(() -> {
      try {
        latch.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      onCompletion();
    });
    executor.shutdown();
  }

  private static class Task implements Runnable {

    /**
     * CountDownLatch 是JDK提供的一个简单的线程监测工具
     * 基于简单的计数,调用countDown()方法表明当前线程已经终止
     * 在监测线程中调用await()方法,该方法会一直挂起直到所有其它线程终止
     */
    private final CountDownLatch latch;

    public Task(CountDownLatch latch) {
      this.latch = latch;
    }

    @Override
    public void run() {
      try {
        doSomeTask();
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        latch.countDown();
      }
    }
  }
}

Hier sind zwei Punkte hinzuzufügen:

1. Wenn Sie den Thread mit der Hauptmethode starten, gibt es bei dieser aufrufenden Methode kein Problem. Das JDK stellt sicher, dass alle Threads beendet werden, bevor die Hauptmethode beendet wird. Wenn die Hauptmethode jedoch nicht der Initiator der asynchronen Aufgabe ist (z. B. JUnit, Spring, Tomcat), verliert der Laucher die Kontrolle über den Thread, sobald er gestartet wird. In JUnit gelten beispielsweise alle Prozesse als abgeschlossen, nachdem Laucher die Aufgabe übermittelt hat, und andere Threads werden zwangsweise beendet.

2. Aus diesem Grund verwenden Sie bitte den richtigen Executor entsprechend der Umgebung. In einer Webumgebung sollten Sie beispielsweise den von Tomcat (oder Spring) verwalteten Thread-Pool als Executor verwenden, um sicherzustellen, dass die Webanwendung die Kontrolle über den gesamten Lebenszyklus der asynchronen Aufgabe hat ; Was sind die Konsequenzen, wenn Sie den JDK-Thread-Pool wählen? Die Aufgabe kann zwar normal ausgeführt werden, aber sobald Sie die Web-App beenden, wird der ausführende asynchrone Thread nicht normal beendet, was zu Speicherverlusten oder anderen unvorhergesehenen Folgen führt.

Das obige ist der detaillierte Inhalt vonJava CountDownLatch vervollständigt die gemeinsame Nutzung des asynchronen Callback-Beispielcodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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