1. 程式人生 > >讓多執行緒有返回值

讓多執行緒有返回值

Runnable,該介面的run方法並無返回值。而Callable的call方法可以根據你傳入的泛型引數返回對應型別的資料。

public class TaskCallable implements Callable<String>{
    private int id;
    public TaskCallable(int id){
        this.id = id;
    }
    @Override
    public String call() throws Exception {
        
        return "result of taskWithResult "+id;
    }
}

 

2.將該任務交給執行緒執行者executor,讓他來代理執行這些執行緒

ExecutorService exec = Executors.newCachedThreadPool();//工頭
ArrayList<Future<String>> results = new ArrayList<Future<String>>();//
for(int i = 0 ; i < 10 ;i++){
    results.add(exec.submit(new TaskCallable(i)));//submit返回一個Future,代表了即將要返回的結果
}

  注意,此時需要使用executor的submit方法來呼叫Callable的call。

  該方法將返回一個Future介面的物件,它的泛型引數代表了call方法要返回的引數型別。

  3.Future型別

  簡單的瞭解了下Future型別:按照名字判斷該型別物件代表了執行緒執行完成後的結果,所以叫Future。那麼在獲取該型別存放的執行緒執行結果時,可能該執行緒並未執行完畢,所以稱其為“將來的結果”。

  •   首先,可以用isDone()方法來查詢Future是否已經完成,任務完成後,可以呼叫get()方法來獲取結果
  •     如果不加判斷直接呼叫get方法,此時如果執行緒未完成,get將阻塞,直至結果準備就緒