Java CountDownLatch 비동기식 콜백 완료 사례 상세 정보

2086 단어 JavaCountDownLatch
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.main 방법으로 시작하는 라인이라면 이 호출 방법은 문제가 없습니다. JDK는 모든 라인이 종료된 후main 방법이 종료될 수 있도록 보장합니다.그러나main 방법이 비동기 작업의 시작자(예를 들어 JUnit, Spring, Tomcat)가 아니라면, 일단 시작하면 laucher는 라인에 대한 제어를 잃게 됩니다.만약에 JUnit에서 laucher가 임무를 제출한 후에 모든 과정이 완성되었다고 여겨지고 다른 라인은 강제로 종료됩니다.
2. 그렇기 때문에 환경에 따라 정확한 Executor를 사용하십시오.예를 들어 웹 환경에서tomcat(또는Spring)이 관리하는 스레드 탱크를 Executor로 선택해야 웹 응용이 비동기적인 작업의 전체 생명주기에 대한 통제권을 확보할 수 있다.만약 당신이 JDK의 스레드 탱크를 선택한다면 어떤 결과가 있습니까?작업이 정상적으로 실행될 수 있습니다. 일단 웹 앱을 종료하면 실행 중인 비동기 라인이 정상적으로 kill되지 않고 메모리 유출이나 다른 예견할 수 없는 결과를 초래할 수 있습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기