>  기사  >  Java  >  Java CountDownLatch는 비동기 콜백 샘플 코드 공유를 완료합니다.

Java CountDownLatch는 비동기 콜백 샘플 코드 공유를 완료합니다.

黄舟
黄舟원래의
2017-03-23 10:29:431720검색

이 글에서는 주로 Java CountDownLatch로 완성되는 비동기 콜백 인스턴스의 상세 설명 관련 정보를 소개하고 있습니다. 필요한 친구는

Java로 완성되는 비동기 콜백 인스턴스의 상세 설명을 참고하세요. CountDownLatch

예제 코드:

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

여기에 추가할 두 가지 사항이 있습니다.

1. 메인 메소드를 사용하여 스레드를 시작합니다. JDK는 메인 메소드가 종료되기 전에 모든 스레드가 종료되도록 보장합니다. 그러나 기본 메서드가 비동기 작업(예: JUnit, Spring, Tomcat)의 시작자가 아닌 경우 실행 프로그램은 스레드가 시작된 후 스레드에 대한 제어를 잃게 됩니다. 예를 들어, JUnit에서는 laucher가 작업을 제출한 후 모든 프로세스가 완료된 것으로 간주되고 다른 스레드는 강제 종료됩니다.

2. 따라서 환경에 맞는 Executor를 사용하시기 바랍니다. 예를 들어, 웹 환경에서는 웹 애플리케이션이 비동기 작업의 전체 라이프 사이클을 제어할 수 있도록 Tomcat(또는 Spring)이 관리하는 스레드 풀을 실행자로 사용해야 합니다. ; JDK 스레드 풀을 선택하면 어떤 결과가 발생합니까? 작업은 정상적으로 실행될 수 있지만 일단 웹앱을 종료하면 실행 중인 비동기 스레드가 정상적으로 종료되지 않아 메모리 누수나 기타 예상치 못한 결과가 발생합니다.

위 내용은 Java CountDownLatch는 비동기 콜백 샘플 코드 공유를 완료합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.