天天看點

看Runnable如何巧避單繼承限制 | 帶你學《Java語言進階特性》之三

上一篇:多線程,從start開始! | 帶你學《Java語言進階特性》之二

【本節目标】

通過閱讀本節内容,你将了解到如何實作Runnable接口并結合Thread類完成多線程的實作,并學會簡單的運用。

基于Runnable接口實作多線程

雖然可以通過Thread類的繼承來實作多線程的定義,但是在Java程式中對于繼承永遠都是存在單繼承的局限的,是以在Java中又提供第二種多線程的主體定義結構形式:實作java.lang.Runnable接口,此接口定義如下:

@FunctionalInterface  //從JDK1.8引入Lambda表達式後就變為了函數式的接口
public interface Runnable{
    public void run() ;
}           

範例:通過Runnable實作多線程主體類

class MyThread implements Runnable {     //線程的主體類
    private String title;
    public MyThread(String title) {
        this.title = title;
    }
    @Override
    public void run() {    //線程的主體方法
        for (int x = 0; x < 10; x++) {
            System.out.printf(this.title + "運作,x =" + x);
        }
    }
}           

但是由于此時不再繼承Thread父類了,那麼對于此時的MyThread類中也就不再支援有start()這個繼承的方法,可是如果不用start()方法是無法進行多線程啟動的,那麼這個時候就需要去觀察一下Thread類所提供的構造方法。

構造方法:

public Thread(Runnable target);           

範例:啟動多線程

public class ThreadDemo {
    public static void main(String[] args) {
        Thread threadA=new Thread(new MyThread("線程對象A")) ;
        Thread threadB=new Thread(new MyThread("線程對象B")) ;
        Thread threadC=new Thread(new MyThread("線程對象C")) ;
        threadA.start() ;      //啟動多線程
        threadB.start() ;      //啟動多線程
        threadC.start() ;      //啟動多線程
    }
}           
看Runnable如何巧避單繼承限制 | 帶你學《Java語言進階特性》之三

圖一 啟動多線程

 這個時候的多線程實作中可以發現,由于隻是實作了Runnable接口對象,是以此時線程主體類就不再有單繼承局限,這樣的設計才是一個标準型的設計。

  可以發現從JDK1.8開始,Runnable接口使用了函數式接口定義,是以也可以直接使用Lambda表達式進行線程類實作。

範例:利用Lambda實作多線程定義

public class ThreadDemo {
    public static void main(String[] args) {
        for (int x = 1; x <= 3; x++) {
            String title = "線程對象-" + x ;
//            Runnable run = () -> {
//                for (int y = 0; y < 10; y++) {
//                    System.out.println(title + "運作,y =" + y);
//                }
//            };
//            new Thread(run).start();
            new Thread(() -> {
                for (int y = 0; y < 10; y++) {
                    System.out.println(title + "運作,y =" + y);
                }
            }).start();
        }
    }
}           
看Runnable如何巧避單繼承限制 | 帶你學《Java語言進階特性》之三

圖二 利用Lambda實作多線程

在以後的開發之中對于多線程的實作,優先考慮的就是Runnable接口實作,并且永恒都是通過Thread類對象啟動多線程。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:深入剖析Thread與Runnable關系 | 帶你學《Java語言進階特性》之四 更多Java面向對象程式設計文章檢視此處