中說過,實現多執行緒有兩種方式:一種是繼承Thread類,另一種是實現Runnable介面。這兩種方式中真正起作用的是run方法,不過run方法並沒有返回值。如果我們希望任務在完成時能夠有返回值,這時就可以使用JDK1.5提供的Callable介面了,Callable是一種具有型別引數的泛型,它的型別引數表示的是從call()方法中返回的值,可以使用ExecutorServiceCompletionServicesubmit()方法來呼叫,返回值是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使用起來還是很麻煩的,而且應用也不是很大,所以一般不怎麼用。