Callable 和 FutureTask 生产者和消费者

   常用的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值