在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); }