Java CompletableFuture-主类未终止

时间:2019-06-14 18:40:13

标签: java-8 completable-future

我正在尝试实现CompletableFuture,该方法在完成时会调用虚拟回调方法。

但是,在添加CompletableFuture.get()方法之后,我的主类没有终止。 我尝试用Thread.sleep(5000)替换CompletableFuture.get(),但这似乎不是正确的方法。 请提出导致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 :(得分:0)

.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");
    }

}

希望这会有所帮助