java多執行緒之Callable
阿新 • • 發佈:2019-01-04
Callable和Runnbale一樣代表著是執行緒任務,區別在於Callable有返回值並且可以丟擲異常。
建立並啟動有返回值的執行緒的步驟如下:
- 建立Callable介面的實現類,並實現call()方法,該call()方法將作為執行緒執行體,並且該call()方法有返回值。
- 將Callable例項傳入FutureTask類。
- 使用FutureTask物件作為Thread物件的target建立並啟動新執行緒。
- 呼叫FutureTask物件的get()方法來獲得子執行緒結束後的返回值。
示例程式碼:
MyCallable類:
public class MyCallable implements Callable<Integer>{ public Integer call() throws Exception { int sum = 0; for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName()+"--->"+i); sum ++; } return sum; } }
Main類:
public class Main { public static void main(String[] args) throws Exception { System.out.println("----------Callable測試-----------------"); Callable<Integer> myCallable = new MyCallable(); FutureTask<Integer> future = new FutureTask<Integer>(myCallable); Thread thread = new Thread(future); thread.start(); try { int sum = future.get(); System.out.println("funture計算完成:"+sum); } catch (Exception e) { e.printStackTrace(); } }
啟動後我們可以看到主執行緒定義的sum變數成功取到MyCallable例項計算得到的sum值。
擴充套件:
在Future接口裡定義如下幾個公共方法來控制它關聯的Callable任務。
- boolean cancel(boolean mayInterruptIfRunning):試圖取消該Future裡關聯的Callable任務。
- V get():返回Callable任務裡call()方法的返回值。呼叫該方法將導致程式阻塞,必須等到子執行緒結束才會得到返回值。
- V get(long timeout,TimeUnit unit):返回Callable任務裡call()方法的返回值,該方法讓程式最多阻塞timeout長的時間,unit為時間單位,如果經過指定時間後Callable任務依然沒有返回值,將會丟擲TimeoutException異常。
- boolean isCancelled():如果此Callable任務正常完成前被取消,則返回true。
- boolean isDone():如果Callable任務已經完成,則返回true。