1. 程式人生 > >callable結合FutureTask的多執行緒使用(免打擾模式)

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();
    }
}