JUC锁框架源码阅读-Future和Callable

使用方法

 public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        /**
         * 异步执行耗时统计操作
         */
        Future<Integer> future = executorService.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                //模拟耗时统计
                Thread.sleep(5000);
                return 5;
            }
        });
        //不用串行等待统计 先执行其他数据组装
        System.out.println("组装数据1");
        System.out.println("组装数据2");
        //如果统计操作没有执行完则等待
        Integer i= (Integer) future.get();
        //统一返回结果
        System.out.println("返回组装数据,耗时统计:"+i);
    }

我们往往都是配合线程池使用。继续往下看

<1>submit

java.util.concurrent.AbstractExecutorService#submit(java.util.concurrent.Callable<T>)

   public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }

java.util.concurrent.AbstractExecutorService#newTaskFor

 protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
        return new FutureTask<T>(callable);
    }

可以发现我们最终返的FutureTask

类图

JUC锁框架源码阅读-Future和Callable 

可以看到FutureTask实现了Runnable

RunnableFuture接口定义

 /**
     * runnable和Future都需要具体实现类实现
     * @param <V>
     */
    public interface RunnableFuture<V> extends Runnable, Future<V> {
        void run();
    

Future接口定义

public interface Future<V> {

    /**
     * 取消当前的Future。会唤醒所有等待结果值的线程,抛出CancellationException异常
     * @param mayInterruptIfRunning 是否中断 计算结果值的那个线程
     * @return 返回true表示取消成功
     */
    boolean cancel(boolean mayInterruptIfRunning);

    // 当前的Future是否被取消,返回true表示已取消。
    boolean isCancelled();

    // 当前Future是否已结束。包括运行完成、抛出异常以及取消,都表示当前Future已结束
    boolean isDone();

    // 获取Future的结果值。如果当前Future还没有结束,那么当前线程就等待,
    // 直到Future运行结束,那么会唤醒等待结果值的线程的。
    V get() throws InterruptedException, ExecutionException;

    // 获取Future的结果值。与get()相比较多了允许设置超时时间。
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

Callable接口定义

public interface Callable<V> {
    /**
     * 与runable不同的是增加了返回值     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

 

JUC锁框架源码阅读-Future和Callable

上一篇:Selenium3自动化测试【23】元素的操作方法


下一篇:漫谈Puppet4