【本節目标】
通過閱讀本節内容,你将了解到Callable的相關功能及其實作方法,對Callable和Runnable之間的差別和聯系有一定的認識,了解到多線程在正常運作中的各種狀态和狀态轉變的時機,對多線程有更深入的了解。
Callable接口實作多繼承
從最傳統的開發來講如果要進行多線程的實作肯定依靠Runnable,但是Runnable接口有一個缺點,當線程執行完畢之後無法擷取一個傳回值,是以從JDK1.5後提出了一個新的線程實作接口:java.util.concurrent.Callable接口。首先來觀察這個接口的定義:
@FunctionalInterface
public interface Callable<V>{
public V call() throws Exception;
}
可以發現Callable定義的時候可以設定一個泛型,此泛型的類型就是傳回資料的類型,這樣的好處在于可以避免向下轉型所帶來的的安全隐患。

圖一 Callable
範例:使用Callable實作多線程處理
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class MyThread implements Callable<String> { //線程的主體類
@Override
public String call() throws Exception {
for (int x = 0; x < 10; x++) {
System.out.println("*********** 線程執行、x = " + x);
}
return "線程執行完畢。";
}
}
public class ThreadDemo {
public static void main(String[] args) throws Exception {
FutureTask<String> task = new FutureTask(new MyThread());
new Thread(task).start();
System.out.println("【線程傳回資料】" + task.get());
}
}
圖二 使用Callable實作多線程處理
面試題:請解釋Runnable和Callable的差別?
- Runnable是在JDK1.0時提出的多線程的實作接口,而Callable是JDK1.5後提出的;
- java.lang.Runnable接口之中隻提供一個run()方法,并且沒有傳回值;
- java.util.concurrent.Callable接口提供有call()方法,可以有傳回值;
多線程運作狀态
對于多線程的開發而言,編寫程式的過程之中總是按照:定義線程主體類,然後通過Thread類進行線程的啟動,但并不意味着調用了start()方法,線程就已經開始運作了,因為整體的線程處理有自己的一套運作的狀态。
圖三 線程運作狀态
- 任何一個線程的對象都應該使用Thread類進行封裝,是以線程的啟動使用的是start(),但是啟動的時候實際上若幹個線程都将進入到一種就緒狀态,現在并沒有執行;
- 進入到就緒狀态後就需要等待進行資源排程,當某一個線程排程成功之後則進入到運作狀态(run()方法),但是所有的線程不可能一直持續執行下去,中間需要産生一些暫停的狀态,例如:某個線程執行一段時間之後就将需要讓出資源,而後這個線程就将進入到阻塞狀态,随後重新回歸到就緒狀态。
- 當run()方法執行完畢之後,實際上該線程的主要任務也就結束了,那麼此時就可以直接進入到停止狀态。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:線程起名,分工有序 | 帶你學《Java語言進階特性》之六 更多Java面向對象程式設計文章檢視此處