码迷,mamicode.com
首页 > 其他好文 > 详细

Future使用场景与分析

时间:2016-11-22 23:17:24      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:调用   public   list   创建   rgs   auth   函数   turn   类型   

  前面分享了CountDownLatch的用法,但是由于分享过程中,发现有些朋友,问我Future与CountDownLatch的有什么区别?

  答案:只是concurrent包下的并发帮助工具类,两者并没有什么联系;对于CountDownLatch是关注与子线程的执行完毕情况,而Future是Callable执行call回调包装的返回值;

  Runnable是执行工作的独立任务,但是它不返回任何值,如果希望任务完成时能够返回一个值,那么可以实现Callable接口,而不是实现Runnable接口,在Java 1.5中引入Callable是一种具有类型参数的泛型,它的类型参数,是从call()函数中获取到的,而不是run()方法,并且必须使用ExecutorService.submit()方法调用它;

  

package demo.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * futurn使用demo
 * 
 * @author bqcoder
 * @version $Id: FuturnDemo.java, v 0.1 2016年11月22日 下午9:07:13 bqcoder Exp $
 */
public class FutureDemo {

    public static void main(String[] args) {
        
        List<Future<String>> taskResults = new ArrayList<Future<String>>();

        //创建线程池,使用future必须要使用executors.submit来调用,《乌龟的屁股,规定》
        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            Future<String> result = executor.submit(new TaskWithResult(i));
            taskResults.add(result);
        }

        //获取执行结果
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println(taskResults.get(i).get());
            } catch (InterruptedException e) {
            } catch (ExecutionException e) {
            }
        }
    }
}

class TaskWithResult implements Callable<String> {

    private int taskId;

    TaskWithResult(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public String call() throws Exception {
        return "执行结果:任务taskId=" + taskId;
    }

}

运行结果:

执行结果:任务taskId=0
执行结果:任务taskId=1
执行结果:任务taskId=2
执行结果:任务taskId=3
执行结果:任务taskId=4
执行结果:任务taskId=5
执行结果:任务taskId=6
执行结果:任务taskId=7
执行结果:任务taskId=8
执行结果:任务taskId=9

  submit()方法会产生Futurn对象,它用Callable返回结果的特定类型进行了参数化,可以使用Future.isDone()来判断Future查询是否完成,如果完成则返回ture,获取值通过get()方法进行获取,如果查询值还没有完成,则进入阻塞状态。

 

<未完待续分析~~~>

 

Future使用场景与分析

标签:调用   public   list   创建   rgs   auth   函数   turn   类型   

原文地址:http://www.cnblogs.com/bqcoder/p/6091305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!