1. 程式人生 > >java多執行緒之Callable

java多執行緒之Callable

Callable和Runnbale一樣代表著是執行緒任務,區別在於Callable有返回值並且可以丟擲異常。

建立並啟動有返回值的執行緒的步驟如下:

  1. 建立Callable介面的實現類,並實現call()方法,該call()方法將作為執行緒執行體,並且該call()方法有返回值。
  2. 將Callable例項傳入FutureTask類。
  3. 使用FutureTask物件作為Thread物件的target建立並啟動新執行緒。
  4. 呼叫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。