JAVA 筆記 Callable 與 FutureTask:有返回值的多線程

轉自:http://www.cnblogs.com/yjl49/archive/2012/09/26/2704274.html


常用的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()方法)。


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