前兩篇博客(多線程——繼承Thread類,多線程——實現Runnable接口 )介紹了java使用線程的兩種方法,這篇博客繼續介紹第三種方法——實現Callable接口。
先說一下Runnable和Callable的區別:
1、Callable規定的方法是call(),Runnable規定的方法是run().
2、Callable的任務執行後可返回值,而Runnable的任務是不能返回值得
3、call方法可以拋出異常,run方法不可以
4、運行Callable任務可以拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。通過Future對象可以了解任務執行情況,可取消任務的執行,還可獲取執行結果。
還沿用前兩篇博客的例子,只不過這裡稍作改動。現在我們不僅要輸入單詞的長度,而且還要求計算出字符串數組中所有單詞的長度之和。
很明顯,這樣一改動,多線程的執行體就需要有一個返回值,用以計算所有單詞的長度之和。而runnable中的run方法是不能有返回值的,所以,這裡我們只能使用callable。具體代碼如下:
package test; import java.util.HashSet; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Test1{ public static void main(String [] args ) { String [] words = {"first","second","world","thread"}; //創建一個線程池 ExecutorService pool = Executors.newCachedThreadPool( ); Set> set = new HashSet >(); for (String word: words) { Callable callable = new testCallable(word); Future future = pool.submit(callable); set.add(future); } int sum = 0; for (Future future : set) { try { sum += future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } System.out.println("數組中所有單詞的總長度為:" + sum); } } class testCallable implements Callable { private String word; public testCallable(String word){ this.word = word; } @Override public Integer call() throws Exception { System.out.println(Thread.currentThread().getName() + ": 開始執行!" ); try { //假設處理需要2秒 Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ": 正在處理!" ); System.out.println(Thread.currentThread().getName() + ": " + word + "長度為:" + word.length()); return Integer.valueOf(word.length()); } }
執行結果如下:
pool-1-thread-1: 開始執行!
pool-1-thread-3: 開始執行!
pool-1-thread-4: 開始執行!
pool-1-thread-2: 開始執行!
pool-1-thread-1: 正在處理!
pool-1-thread-1: first長度為:5
pool-1-thread-3: 正在處理!
pool-1-thread-3: world長度為:5
pool-1-thread-2: 正在處理!
pool-1-thread-2: second長度為:6
pool-1-thread-4: 正在處理!
pool-1-thread-4: thread長度為:6
數組中所有單詞的總長度為:22
至此,java中創建線程的三種方法都以介紹完畢。當然,了解了這些只能說明對於多線程你剛剛入門,更多關於多線程的知識還有待於我們繼續發掘,深入研究。