callable結合FutureTask的多線程使用(免打擾模式)

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章