callable結合FutureTask的多執行緒使用(免打擾模式)
阿新 • • 發佈:2019-01-07
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();
}
}
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=
//讓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();
}
}