Java CountDownLatch 비동기식 콜백 완료 사례 상세 정보
2086 단어 JavaCountDownLatch
인스턴스 코드:
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되지 않고 메모리 유출이나 다른 예견할 수 없는 결과를 초래할 수 있습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.