Java CompletableFuture - основной класс не завершен - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь внедрить 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 () удерживает блокировку.

1 Ответ

0 голосов
/ 15 июня 2019

.thenApply функция возвращает новый экземпляр CompletableFuture, и именно этот экземпляр вам нужно использовать, попробуйте использовать этот способ вместо этого:

public class CallableAsyncWithCallBack {

    public static void main(String[] args) throws InterruptedException {
        CompletableFuture<String> compFuture = CompletableFuture.supplyAsync(() -> {
            //Compute total
            long count = IntStream.range(Integer.MIN_VALUE, Integer.MAX_VALUE).count();
            return "" + count;
        });

        CompletableFuture<String> future = compFuture.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 {
            future.get();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("Lock cleared");
    }

}

Надеюсь, это поможет

...