Java에서 CompletableFuture를 사용할 때 문제가 있습니다. 서버에서 응답을받을 때 채워지는 2 개의 선택 요청이 있습니다.Java CompletableFuture.complete() block
if(hasException) {
selectFuture.completeExceptionally(new ClientException(errorCode));
} else {
System.out.println("Before complete future");
selectFuture.complete(result);
System.out.println("After complete future");
}
을 그리고 다른 스레드 (thread에-2), 내가 사용 : 연결 스레드에서
(THREAD-1) (사용 반응기), 내가 사용CompleteFuture.allOf(allSelect).whenComplete((aVoid, throwable) -> {
System.out.println("Receive all future");
// Do sth here
});
내 상황을 시스템이 "Receive all future"를 인쇄하지만 future.complete(result);
을 호출하면 THREAD-1이 차단된다는 것입니다.이 명령에서 빠져 나올 수는 없습니다. THREAD-2에서 CompletableFuture.allOf(allOfSelect).get()
을 사용하면 THREAD-1이 올바르게 실행됩니다. 하지만 CompletableFuture.get()
을 사용하면 성능이 저하되므로 CompletableFuture.whenComplete()
을 사용하고 싶습니다.
누구든지 차단의 원인을 설명 할 수 있습니까?
감사합니다.
정말 고마워요. 귀하의 설명은 스레딩에 대해 매우 분명합니다. CompletableFuture를 처음 사용하는 경우에는 클라이언트에서 서버로 SELECT, UPDATE 등의 단일 요청을 호출하는 용도로만 사용하므로 클라이언트가 내 기대치 (클라이언트가 응답을 기다리고 미래를 채울 때까지)로 완벽하게 실행됩니다. 하지만 지금은 TRANSACTION을 수행하는 데 문제가 있습니다. 왜냐하면 단계가 있기 때문입니다. 모든 SELECT가 끝난 후에 CompletableFuture로 즉시 미래를 반환하고 싶지만 다른 실행 (UPDATE, DELETE)에 결과가있을 때만 미래가 채워집니다. 사슬에서 물건을 처리 할 수있는 해결책을 제안 해 줄 수 있습니까? 많은 감사! –
다음과 같은 순서로 작업하고 싶습니다. 1. SELECT -> CompletableFuture 2. PREPARE -> CompletableFuture (다른 호출도 CompletableFutures를 반환합니다). 3. COMMIT -> CompletableFuture 및 등록시 등록자가 즉시 트랜잭션을 반환해야합니다. 많은 감사! –