callable结合FutureTask的多线程使用(免打扰模式)

View Code
package use.of.futuretask;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 
 *
 * Callable类就是一个有返回值的任务
 * 对于任务与Thread之间的关系,可以这样子理解:
 * Callable类的实例就是一个锦囊妙计;而Thread就是执行这个锦囊妙计的过程
 * 
 * FutureTask类(Future接口的一个实现)就是一个监视器:检测着被若干个异步线程操作的变量的一个类
 * 
 * 代码演示了主线程如何通过使用Callable类和FutureTask类,实现:
 * 主线程一边等待子线程的处理结果,一边完成自己的工作。
 *
 *考虑以下一个小黑工kaiwii的故事……
 */

public class TestFutureTask {
    


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //准备一份工作给一个打工仔employee叫Kaiwii
        Employee kaiwii=new Employee("kaiwii");
        //新建一个监工头inspector
        FutureTask<Double>inspector=new FutureTask<Double>(kaiwii);
        //让kaiwii这个打工仔工作
        System.out.println("老板发话,让kaiwii这个打工仔工作吧!");
        new Thread(inspector).start();
        System.out.println("老板开始数钱!");
        //老板一边数钱,一边命令监工inspector监视Kaiwii工作;一旦kaiwii完成工作就拿来让他检查
        while(!inspector.isDone()){
            System.out.println("老板数钱中……");
            try {
                Thread.sleep(2000);
                System.out.println("111");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        //老板交监工inspector将kaiwii的结果呈上来以便他验收kaiwii计算出来的结果
        try {
            System.out.println("老板发现kaiwii的结果是:"+inspector.get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

//子线程
class Employee implements Callable<Double>{
    String employee_name;
    
    private void setEmployee_name(String employee_name) {
        this.employee_name = employee_name;
    }
    
    public Employee(String employee_name) {
        setEmployee_name(employee_name);
    }
    @Override
    public Double call() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("工人"+employee_name+"说:我开始工作了!!!!");
        for(int i=1;i<=3;i++){
            System.out.println("工人"+employee_name+" 第"+i+"次说:我在工作呢!!!!");
            Thread.sleep(1000);
            System.out.println("222");
        }
        System.out.println("工人"+employee_name+"说:我搞好了!!!!");
        return Math.random();
    }
}

http://blog.csdn.net/kaiwii/article/details/6773971

posted on 2012-09-12 10:40  Jessie~Alexandery  阅读(125)  评论(0)    收藏  举报

导航