有返回值、可取消的异步任务--Future

之前线程池执行的任务是没有返回值的,但这种有返回值的Future任务,可以适应更多的场景。

取消:boolean cancel(boolean mayInterruptIfRunning);
if(!future.isCancelled()){
	future.cancel();
}	
返回值:V get() throws InterruptedException, ExecutionException;
try {
      futureResult = (String) future.get();
} catch (Exception e) {
      // 异常处理  
} 

举个栗子:

1、正常流程,同步执行:

public static void main(String[] args) throws InterruptedException, ExecutionException {
        long startTime= System.currentTimeMillis();
        System.out.println("主线程任务开始执行");

        System.out.println("future 任务执行开始");
        Thread.sleep(6000);
        System.out.println("future 任务执行结束");
        String result = "2019";

        // 主线程任务
        mainThreadWork();

        String futureResult = result;
        System.out.println("futureResult:"+futureResult);
        System.out.println("主线程任务执行结束");
        long endTime= System.currentTimeMillis();

        System.out.println("时间消耗:"+ (endTime-startTime));
    }

    private static void mainThreadWork() throws InterruptedException {
        System.out.println("主线程任务--继续执行,状态1");
        Thread.sleep(3000);
        System.out.println("主线程任务--继续执行,状态2");
    }

控制台

主线程任务开始执行
future 任务执行开始
future 任务执行结束
主线程任务--继续执行,状态1
主线程任务--继续执行,状态2
futureResult:2019
主线程任务执行结束
时间消耗:9001

2、Future:

 public static void main(String[] args) throws InterruptedException, ExecutionException {
        long startTime= System.currentTimeMillis();
        System.out.println("主线程任务开始执行");

        ExecutorService executorService = Executors.newFixedThreadPool(1);
        Future future = executorService.submit(()->{
            System.out.println("future 任务执行开始");
            Thread.sleep(6000);
//            if (1 == 1){
//                throw new Exception("111");
//            }
            System.out.println("future 任务执行结束");
            return "2019";
        });

        mainThreadWork();

        // 内部异常已抛出,此处无须catch
        String futureResult = (String) future.get();

        System.out.println("futureResult:"+futureResult);
        executorService.shutdown();

        System.out.println("主线程任务执行结束");
        long endTime= System.currentTimeMillis();

        System.out.println("时间消耗:"+ (endTime-startTime));
    }

    private static void mainThreadWork() throws InterruptedException {
        System.out.println("主线程任务--继续执行,状态1");
        Thread.sleep(3000);
        System.out.println("主线程任务--继续执行,状态2");
    }

控制台打印

主线程任务开始执行
主线程任务--继续执行,状态1
future 任务执行开始
主线程任务--继续执行,状态2
future 任务执行结束
futureResult:2019
主线程任务执行结束
时间消耗:6221

3、CompletableFuture

public static void main(String[] args) throws InterruptedException, ExecutionException {
        long startTime= System.currentTimeMillis();
        System.out.println("主线程任务开始执行");

        Future future = CompletableFuture.supplyAsync(()->{
            System.out.println("future 任务执行开始");
            try {
                Thread.sleep(6000);
            } catch (InterruptedException e) {
            }
//            if (1 == 1){
//                throw new RuntimeException("111");
//            }
            System.out.println("future 任务执行结束");
            return "2019";
        });

        mainThreadWork();

        String futureResult = (String) future.get();
        System.out.println("futureResult:"+futureResult);

        System.out.println("主线程任务执行结束");
        long endTime= System.currentTimeMillis();

        System.out.println("时间消耗:"+ (endTime-startTime));
    }

    private static void mainThreadWork() throws InterruptedException {
        System.out.println("主线程任务--继续执行,状态1");
        Thread.sleep(3000);
        System.out.println("主线程任务--继续执行,状态2");
    }

控制台

主线程任务开始执行
主线程任务--继续执行,状态1
future 任务执行开始
主线程任务--继续执行,状态2
future 任务执行结束
futureResult:2019
主线程任务执行结束
时间消耗:6177

你可能感兴趣的:(有返回值、可取消的异步任务--Future)