繼承與實現線程接口的區別

在java中,啓動線程有兩種方法,一種是繼承Thread類,第二種是實現Runnable的接口。 繼承Thread類以下java

class ThreadA extends Thread {
    @Override
    public void run() {
        ......
    }
}

實現接口的方式ide

class ThreadB implements Runnable {
    @Override
    public void run() {
         ......
    }
}

下面是Thread的run方法的源碼.線程

public void run() {
        if (target != null) {
            target.run();
        }
    }

target是Thread類裏面Runnable的成員變量,以下code

/* What will be run. */
    private Runnable target;

也就是說,線程在運行run方法的時候,會判斷在new 一個Thread的時候,你沒有傳入Runnable的參數,若是傳了,線程直接運行target本身的run方法,這也就說明了,爲何實現Runnable的接口,就必須實現run方法,而繼承的線程,就必須本身手寫run方法。繼承

這就是經過繼承和實現接口來啓動線程不一樣的地方。還有一個須要說明一下,因爲JDK1.8引用的Java lambda的新特性,因此還能夠經過 Lambda來實現接口方式的線程,代碼以下接口

new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("thread Lambda : " + i);
            }
        }).start();

補充一下,線程裏還有一個方法叫get

private static synchronized int nextThreadNum() {
        return threadInitNumber++;
    }

這個方法加鎖了,是用於給線程起名字,若是你默認不傳名字的話,程序會自動給當前線程賦一個默認的名字,名字規則如代碼所示源碼

public Thread() {
        init(null, null, **"Thread-" + nextThreadNum()**, 0);
    }
相關文章
相關標籤/搜索