Maison  >  Article  >  Java  >  Java CountDownLatch termine le partage d'exemples de code de rappel asynchrone

Java CountDownLatch termine le partage d'exemples de code de rappel asynchrone

黄舟
黄舟original
2017-03-23 10:29:431765parcourir

Cet article présente principalement les informations pertinentes sur l'explication détaillée de l'instance de rappel asynchrone complétée par Java CountDownLatch. Les amis qui en ont besoin peuvent se référer à

Explication détaillée de l'instance de rappel asynchrone complétée par Java. CountDownLatch

Exemple de code :

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();
      }
    }
  }
}

Il y a deux points à ajouter ici :

1. Si vous démarrez le thread en utilisant la méthode principale, il n'y a aucun problème avec cette méthode d'appel. Le JDK garantira que tous les threads sont terminés avant la fin de la méthode principale. Mais si la méthode principale n'est pas l'initiatrice de la tâche asynchrone (comme JUnit, Spring, Tomcat), le lanceur perdra le contrôle du thread une fois celui-ci démarré. Par exemple, dans JUnit, une fois que Laucher a soumis la tâche, tous les processus seront considérés comme terminés et les autres threads seront arrêtés de force.

2. Pour cette raison, veuillez utiliser le bon exécuteur en fonction de l'environnement. Par exemple, dans un environnement Web, vous devez utiliser le pool de threads géré par Tomcat (ou Spring) comme exécuteur, afin de garantir que l'application Web contrôle l'ensemble du cycle de vie de la tâche asynchrone. ; si vous choisissez le pool de threads JDK Quelles sont les conséquences ? La tâche peut être exécutée normalement, mais une fois l'application Web terminée, le thread asynchrone en cours d'exécution ne sera pas tué normalement, provoquant des fuites de mémoire ou d'autres conséquences imprévues.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn