JAVA 笔记 Callable 与 FutureTask:有返回值的多线程

来源:互联网 发布:贵州大数据股票有哪些 编辑:程序博客网 时间:2024/05/22 02:18

     常用的Thread类在run方法执行完之后是没有返回值的,要实现子线程完成任务后返回值给主线程需要借助第三方转存。Callable接口则提供了一种有返回值的多线程实现方法。下面以一个简单的地主、监工和长工的例子展示这种接口的用法。

长工类:

长工类实现了Callable接口,线程运行完成后返回一个Integer值。 

import java.util.concurrent.Callable;public class Changgong implements Callable<Integer>{    private int hours=12;    private int amount;        @Override    public Integer call() throws Exception {        while(hours>0){            System.out.println("I'm working......");            amount ++;            hours--;            Thread.sleep(1000);        }        return amount;    }}

 地主:主进程

监工:FutureTask 

import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;public class Dizhu {            public static void main(String args[]){        Changgong worker = new Changgong();        FutureTask<Integer> jiangong = new FutureTask<Integer>(worker);        new Thread(jiangong).start();        while(!jiangong.isDone()){            try {                System.out.println("看长工做完了没...");                Thread.sleep(1000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        int amount;        try {            amount = jiangong.get();            System.out.println("工作做完了,上交了"+amount);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ExecutionException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }                    }}

 运行结果:

看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...I'm working......看工人做完了没...工作做完了,上交了12

从上面的例子可以看出,FutureTask 扮演了一个监工的角色,地主(主进程)通过不断地询问监工(isDone()方法)可以得知长工的工作是否完成,并且在长工完成工作后让监工收取成果(get()方法)。


转载自:http://www.cnblogs.com/yjl49/archive/2012/09/26/2704274.html


0 0
原创粉丝点击