Java并发-异步执行Future

Future接口在Java中用于异步执行并获取结果。FutureTask作为其具体实现,结合了Future和Runnable接口,常用于线程池的submit方法。FutureTask的状态管理包括New、Running、Completed等状态,其run方法执行Callable任务并处理结果。get方法会阻塞直到任务完成,报告结果或抛出异常。取消任务执行和Java8的CompletableFuture提供了更多异步编程的可能性。
摘要由CSDN通过智能技术生成

Java并发-异步执行Future

在开发过程中很容易遇到这么一种情况,要执行一个耗时的任务,为了提高效率我们在执行耗时任务的时候同时执行其他暂时不需要耗时任务的代码,直到需要这个耗时任务的返回时才去获取任务结果,那么在Java中Future接口是专门用来异步执行,并在需要的时候获取执行的结果的一个接口。典型的我们有

/**
 * jdk 8
 * /
public class Main {
    public static void main(String[] args) {
        ExecutorService exec = new ThreadPoolExecutor(100, 200, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500));
        Future<String> future = exec.submit(Main::doSomethingNeedTime);
        //其他的操作
        try{
            String result = future.get();
        }catch (Exception ex){
            //log
        }
    }

    private static String doSomethingNeedTime(){
        try {
            TimeUnit.SECONDS.sleep(1);
        }catch (InterruptedException ex){
            //log
        }
        return "over";
    }
}

在这里线程池submit方法返回的是一个FutureTask类,接下来我们就从源码入手讲一讲这个FutureTask具体是怎么工作的。

FutureTask

FutureTask实现了FutureRunnable接口,而这个接口又继承了Future接口和Runnable接口。

public class FutureTask<V> implements RunnableFuture<V> 

正式因为FutureTask实现的接口FutureRunnable即继承了Future接口又继承了Runnable接口所以ThreadPoolExecutor的submit方法其实是将Callable用FutureTask适配成了Runnable最后调用了execute方法。

Future的主要字段如下

    //代表当前FutureTask的状态
    private volatile int state;
    private static final int NEW          = 0;
    private static final int COMPLETING   = 1;
    private static final int NORMAL       = 2;
    private static final int EXCEPTIONAL  = 3;
    private static 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值