callable结合FutureTask的多线程使用(免打扰模式)转载:http://blog.csdn.net/kaiwii/article/details/6773
callable结合FutureTask的多线程使用(免打扰模式)
转载:http://blog.csdn.net/kaiwii/article/details/6773971
分类:?Java考古学?设计模式2011-09-14 11:40?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
?