Я пытаюсь внедрить CompletableFuture, который вызывает фиктивный метод обратного вызова после завершения.
Однако после добавления метода CompletableFuture.get () мой основной класс не завершается.
Я пытался заменить CompletableFuture.get () на Thread.sleep (5000), но это не совсем правильный подход.
Пожалуйста, предложите, что заставляет CompletableFuture.get () продолжать блокировать, даже если поток завершен.
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.IntStream;
public class CallableAsyncWithCallBack {
public static void main(String[] args) throws InterruptedException {
CompletableFuture<String> compFuture=new CompletableFuture<String>();
compFuture.supplyAsync(()->{
//Compute total
long count=IntStream.range(Integer.MIN_VALUE, Integer.MAX_VALUE).count();
return ""+count;
}).thenApply(retVal->{
try {
return new CallBackAsynchClass(retVal).toString();
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
);
System.out.println("Main Thread 1");
try {
compFuture.get();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("Lock cleared");
}
}
class CallBackAsynchClass
{
String returnVal="";
public CallBackAsynchClass(String ret) throws InterruptedException, ExecutionException {
System.out.println("Callback invoked:"+ret);
returnVal=ret;
}
@Override
public String toString() {
return "CallBackAsynchClass [returnVal=" + returnVal + "]";
}
}
Я ожидаю, что будет выведен «Блокировка снята», но, похоже, .get () удерживает блокировку.