讓多執行緒有返回值
阿新 • • 發佈:2018-11-29
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將阻塞,直至結果準備就緒