이 글에서는 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!