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

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

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

分类: Java考古学 设计模式   137人阅读  评论(0)  收藏  举报
import java.util.concurrent.Callable ;
import java.util.concurrent.ExecutionException ;
import java.util.concurrent.FutureTask ;

/**
 * 
 * @author Kaiwii Ho
 * 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 ( 500) ;
             }  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 <= 10;i ++){
            System.out.println ( "工人" +employee_name + " 第" +i + "次说:我在工作呢!!!!" );
            Thread.sleep ( 1000) ;
         }
        System.out.println ( "工人" +employee_name + "说:我搞好了!!!!" );
         return Math.random ();
     }
}

console显示结果:

老板发话,让kaiwii这个打工仔工作吧!
老板开始数钱!
工人kaiwii说:我开始工作了!!!!
工人kaiwii 第1次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第2次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
老板数钱中……
工人kaiwii 第3次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第4次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第5次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第6次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第7次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第8次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第9次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第10次说:我在工作呢!!!!
老板数钱中……
工人kaiwii说:我搞好了!!!!
老板数钱中……
老板发现kaiwii的结果是:0.5295364482450889

猜你喜欢

转载自rongdmmap-126-com.iteye.com/blog/1431595
今日推荐