线程(七)CallableAndFuture

来源:互联网 发布:php的就业前景好 编辑:程序博客网 时间:2024/04/30 03:27

我们在前面的总结中的所有的线程的使用,大家有没有觉的有一个问题就是我们得不到线程的执行的返回的结果,这个是不是有点然人懊恼,对的我们只是创建了线程去执行,但是我们没有获取到他的返回值,在有些时候这个是不必须的,但是如果我们 需要线程的执行结果呢,我们需要线程的执行结果加以运算之类的,怎么办,别着急,我们还有方法可以取到线程的执行结果的,那就是Callable,Callable就是帮助我们获取到线程的执行结果,我们在使用Callable的时候需要重写他的Call()方法.在使用Callable的时候我们配合的使用Future,那么我们就可达到这样的效果:我们的线程在执行一些费时的操作,我们可以先把线程装进我们的一个容器里,等到我们需要的时候我们直接从容器中取结果就OK;下面我们来看下我们的代码

public class CallableAndFuture {    public static void main(String[] args) {        //创建一个线程返回随机的Int        Callable callable = new Callable() {            @Override public Object call() throws Exception {                return new Random().nextInt();            }        };        FutureTask task = new FutureTask(callable);        new Thread(task).start();        try {            //等待的结果我们可以做很多事情            Thread.sleep(5000);            //阻塞等待 结果返回            System.out.println(task.get());        } catch (InterruptedException e) {            e.printStackTrace();        } catch (ExecutionException e) {            e.printStackTrace();        }    }}
我们可以看到我们时候用的是 FutureTask 这个容器来装在我们的线程,最后调用他的Task方法就可以取得线程执行的结果了.FutureTask实现了Runable接口和Future接口,那么说名他可以执行我们的线程也可以获取我们线程的执行 结果,Future里面有很多的线程相关的方法,大家可以进去看看源码,检测函数和获取结果函数等等
下面我们在使用一个线程池的方式来卡看我们的Callable和Future的使用:
public class CallableAndFutrue2 {    public static void main(String[] args) {        //创建一个线程池,需要几个就创建几个的线程池        ExecutorService service = Executors.newCachedThreadPool();        //用来存储线程结果        List<Future> futures = new ArrayList<Future>();        //创建5个线程加入队列阻塞获取        for (int i = 0; i < 5; i++) {            Callable callable = new Callable() {                @Override public Object call() throws Exception {                    return new Random().nextInt();                }            };            Future future = service.submit(callable);            futures.add(future);        }        for (Future future : futures) {            try {                System.out.println(future.get());            } catch (InterruptedException e) {                e.printStackTrace();            } catch (ExecutionException e) {                e.printStackTrace();            }        }    }}
我们 创建一个Future容器来装在我们的线程执行结果,最后遍历这个容器就可以取得结果了.我们 使用的是上一节我们总结的newCachedThreadPoll当时创建的线程池.
1 0
原创粉丝点击