Future

作者: 无量散人 | 来源:发表于2017-12-08 18:22 被阅读11次

简介

Future表示一个异步逻辑的结果,有检查异步逻辑是否完成的方法,且等待异步逻辑完成之后获取异步逻辑的结果。

使用场景

在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果,所以run的返回值是void类型。

如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。 但后者需要前者的结果,就需要用callable接口了。 callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定
然而线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数的返回值。此时Future就出场了,Future可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直到call方法结束并返回结果。

代码

public class FutureTest {

    /**
     * 线程类继承Runnable接口,实现run方法,返回值是void类型
     */
    public static class Task implements Runnable{
        private Integer num ;

        public Task(Integer num){
            this.num = num;
        }

        @Override
        public void run() {
            System.out.println("thread running..." + num);
        }
    }

    public static void main(String[] args){
        try {
            ExecutorService es = Executors.newCachedThreadPool();
            for (int i=0; i<5; i++){
                es.submit(new Task(i));
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
public class FutureTest {

    /**
     * 线程类继承Callable接口,实现call方法,返回值是一个泛型
     */
    public static class Task implements Callable<String> {
        @Override
        public String call() throws Exception {
            String tid = String.valueOf(Thread.currentThread().getId());
            System.out.printf("Thread#%s : in call\n", tid);
            return tid;
        }
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        List<Future<String>> results = new ArrayList<Future<String>>();
        ExecutorService es = Executors.newCachedThreadPool();
        for(int i=0; i<5;i++){
            results.add(es.submit(new Task()));
        }

        for(Future<String> res : results){
            System.out.println(res.get());
        }
        
        es.shutdown();
    }
}

相关文章

网友评论

      本文标题:Future

      本文链接:https://www.haomeiwen.com/subject/wqjjixtx.html