實現多執行緒的第三種方式之Callable
阿新 • • 發佈:2019-01-23
中說過,實現多執行緒有兩種方式:一種是繼承Thread類,另一種是實現Runnable介面。這兩種方式中真正起作用的是run方法,不過run方法並沒有返回值。如果我們希望任務在完成時能夠有返回值,這時就可以使用JDK1.5提供的Callable介面了,Callable是一種具有型別引數的泛型,它的型別引數表示的是從call()方法中返回的值,可以使用ExecutorService或CompletionService的submit()方法來呼叫,返回值是Future型別,表示非同步計算的結果,只能使用get()方法來獲取結果。
下面使用Callable實現列印一個斐波那契數列並返回其總和。
package com.gk.thread.callable; import java.util.concurrent.Callable; public class MyCallable implements Callable<Long>{ private int count; public MyCallable(int count) { this.count = count; } @Override public Long call() { long x = 1 , y = 1; long z = 0; long sum = x + y; System.out.print("前" + count + "個斐波那契數列是 : " + x + ", " + y + ", "); for (int i=1; i<=count-2; i++) { z = x + y; System.out.print(z); if(i < count-2) System.out.print(", "); x = y; y = z; sum += z; } System.out.println(); return sum; } }
測試程式碼
package com.gk.thread.callable; 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 Test { public static void main(String[] args) throws InterruptedException, ExecutionException { final int NUMBER = 10; ExecutorService es = Executors.newSingleThreadExecutor(); Callable<Long> cc = new MyCallable(NUMBER); Future<Long> f = es.submit(cc); System.out.println("總數為" + f.get()); es.shutdown(); } }
雖然Callable可以獲取返回值,但是我們也看到了,Callable使用起來還是很麻煩的,而且應用也不是很大,所以一般不怎麼用。