1.Runnable介面
實現Runnable介面的類必須使用Thread類的執行個體才能建立線程(事實上,Thread類也實現了Runnable介面),它允許你定義一個可以由線程完成的任務。如大多數人所已知的那樣,它只提供了一個run方法,該方法既不接受任何參數,也不返回任何值。如果你需要從一個未完成的任務中返回一個值,你就必須在該介面之外使用一個方法去等待該任務完成時通報的某種訊息。例如:
Runnable runnable = ...; Thread t = new Thread(runnable); t.start(); t.join(); String value = someMethodtoGetSavedValue()
從嚴格上來說,其實上述代碼是沒有問題的,但是自從JAVA5.0以後,引入了Callable介面。
2.Cabllable介面
Callable介面其實與Runnable介面類似,只不過Runnable介面是實現run方法,而Callable介面實現call方法。參照Callable的API,該方法可以返回一個Object對象,或可返回任何一個在泛型化格式中定義了的特定類型的對象。因為你不可能把Callable對象傳到Thread對象去執行,你可換用ExecutorService對象去執行Callable對象。該服務接受Callable對象,並經由submit方法去執行它。 提交一個Callable對象給ExecutorService會返回一個Future對象。然後,Future的get方法將會阻塞,直到任務完成。call方法的唯一要求是這個值要在call方法的結尾處返回。當Future的get方法稍後被調用時,如果任務運行得很快的話,Future將會自動得到這個值,否則將一直等到該值產生完畢為止。更多資訊:
3.Future介面
首先瞭解Future模式:我有一個任務,提交給了Future,Future替我完成這個任務。期間我自己可以去做任何想做的事情。一段時 間之後,我就便可以從Future那兒取出結果。就相當於下了一張訂貨單,一段時間後可以拿著提訂單來提貨,這期間可以幹別的任何事情。其中Future介面就是訂貨單,真正處理訂單的是Executor類,它根據Future介面的要求來生產產品。那麼,Future介面是Java線程Future模式的實 現,可以來進行非同步計算。
4.Executor介面
Executor介面執行已提交的 Runnables任務的對象。此介面提供一種將任務提交與每個任務將如何啟動並執行機制(包括線程使用的細節、調度等)分離開來的方法。通常使用
Executor 而不是顯式地建立線程。並發編程的一種編程方式是把任務拆分為一些列的小任務,即Runnable,然後在提交給一個Executor執行,Executor.execute(Runnalbe)。Executor在執行時使用內部的線程池完成操作。