有返回值、可取消的异步任务--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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值