FutureTask的類圖
從FutureTask的類圖中可以看出,FutureTask實現了Runnable接口和Future接口,所以它兼備Runnable和Future兩種特性,下面先來看看如何使用FutureTask來啟動一個新的線程:
1 public class FutureTaskDemo { 2 public static void main(String[] args) { 3 ACallAble aCallAble = new ACallAble(); 4 FutureTask futureTask = new FutureTask(aCallAble); 5 Thread thread = new Thread(futureTask); 6 thread.start(); 7 do { 8 9 }while (!futureTask.isDone()); 10 try { 11 Object result = futureTask.get(); 12 System.out.println("Result:"+result); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } catch (ExecutionException e) { 16 e.printStackTrace(); 17 } 18 } 19 20 } 21 class ACallAble implements Callable{ 22 23 @Override 24 public Object call() throws Exception { 25 Thread.sleep(1000); 26 return "Thread-Name:"+Thread.currentThread().getName(); 27 } 28 }
可以看到,使用FutureTask來啟動一個線程之后,我們可以監控這個線程是否完成,上面的示例中主線程會一直等待這個新創建的線程直到它返回,其實只要是Future提供的接口,我們在FutureTask中都可以使用,這極大的方便了我們,Future在並發編程中的意義極為重要,Future代表一個未來會發生的東西,它是一種暗示,一種占位符,它示意我們它可能不會立即得到結果,因為它的任務還在運行,但是我們可以得到一個對這個線程的監控對象。
我們可以對線程的執行做一些判斷,甚至是控制,比如,如果我們覺得我們等了太久,並且我們覺得沒有必要再等待下去的時候,就可以將這個Task取消,還有一點需要提到的是,Future代表它可能正在運行,也可能已經返回,當然Future更多的暗示你可以在等待這個結果的同時可以使用其他的線程做一些其他的事情,當你真的需要這個結果的時候再來獲取就可以了,這就是並發,理解這一點非常重要。