在並發編程時,一般使用runnable,然后扔給線程池完事,這種情況下不需要線程的結果。
所以run的返回值是void類型。
如果是一個多線程協作程序,比如菲波拉切數列,1,1,2,3,5,8...使用多線程來計算。
但后者需要前者的結果,就需要用callable接口了。
callable用法和runnable一樣,只不過調用的是call方法,該方法有一個泛型返回值類型,你可以任意指定。
線程是屬於異步計算模型,所以你不可能直接從別的線程中得到函數返回值。
這時候,Future就出場了。Futrue可以監視目標線程調用call的情況,當你調用Future的get()方法以獲得結果時,當前線程就開始阻塞,直接call方法結束返回結果。
下面三段簡單的代碼可以很簡明的揭示這個意思:
runnable接口實現的沒有返回值的並發編程。
callable實現的存在返回值的並發編程。(call的返回值String受泛型的影響)
同樣是callable,使用Future獲取返回值。
貼一個完整可運行的程序代碼 FutureTest.java
package demo.future; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; /** * 試驗 Java 的 Future 用法 */ public class FutureTest { public static class Task implements Callable<String> { @Override public String call() throws Exception { String tid = String.valueOf(Thread.currentThread().getId()); System.out.printf("Thread#%s : in call\n", tid); return tid; } } public static void main(String[] args) throws InterruptedException, ExecutionException { List<Future<String>> results = new ArrayList<Future<String>>(); ExecutorService es = Executors.newCachedThreadPool(); for(int i=0; i<100;i++) results.add(es.submit(new Task())); for(Future<String> res : results) System.out.println(res.get()); } }

