繼承Thread類方式
1. 線程啟動時:一定是調用Thread類的start()方法,因為通過源碼解析發現,start()方法中,最后會調用以native關鍵字修飾的start0()方法,該方法會通過JVM實現不同操作系統不同實現的
資源調度分配;
2. Native關鍵字:調用本機的操作系統函數。
實現Runnable接口方式
1. 實現Runnable接口:由于繼承Thread類會造成單繼承的局限性,所以利用接口來實現;
2. Runnable接口:因為其是函數式接口,所以該接口中只有一個方法,可以使用Lamda表達式完成;
3. @FunctionalInterface:修飾的接口為函數式接口;
4. 由于啟動發多線程只能通過start()方法,但Runnable方法中沒有此方法,故實現該接口并啟動一個線程,是通過Thread的構造函數發現:
public Thread(Runnable targer) ,所以可以通過此方式來啟動一個多線程;
實例:Runnnable接口方式
public class Test11 {
public static void main(String[] args) {
Test11Demo t1 = new Test11Demo("線程1");
Test11Demo t2 = new Test11Demo("線程2");
Test11Demo t3 = new Test11Demo("線程3");
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
}
}
class Test11Demo implements Runnable {
private String name;
Test11Demo(String name) {
this.name = name;
}
@Override
public void run() {
for (int x = 0; x < 10; x++) {
System.out.println(this.name + ",x=" + x);
}
}
}實例:Lamda方式,內部類方式
在原來代碼基礎上,添加測試代碼
public static void main(String[] args) throws Exception {
Test11Demo t1 = new Test11Demo("線程1");
Test11Demo t2 = new Test11Demo("線程2");
Test11Demo t3 = new Test11Demo("線程3");
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
final String name1 = "Lamda測試";
new Thread( ()->{
for (int x = 0; x < 10; x++) {
System.out.println(name1 + ",x=" + x);
}
}).start();
final String name = "內部類測試";
new Thread(new Runnable() {
@Override
public void run() {
for (int x = 0; x < 10; x++) {
System.out.println(name + ",x=" + x);
}
}
}).start();
}兩種方式,啟動線程的異同
1. 查看源碼可知,Thread類定義:
public classThread extends Object implements Runnable
2. 類關系圖:

綜上,可知,
多線程需要一個線程主類:可以繼承Thread類,也可以實現Runnable接口;
使用Runnable接口,可以更好的實現數據共享的操作;并可以避免Thread類帶來的單繼承局限性;
線程的命名和取得
1. 線程的所有操作方法基本上都已經在Thread類中定義完整;
2. 如下方法,可提供線程名稱操作:
① 構造方法:public Thread(Runnable target,String name)
② 設置名字:public final void setName(String name)
③ 獲取名字:public final String getName()
④ 由于線程執行本身不確定狀態,
提供方法:public static Thread currentThread()來取得當前線程
3. 如果在設置線程對象名稱時,沒有設置具體名字,則會采用默認名字進行定義;
4. 每一個JVM至少會啟動兩個線程:主線程,GC線程;
線程的休眠
休眠方法:sleep();線程的睡眠,是有先后順序的
線程的優先級
1. 優先級操作方法:
設置優先級:public final void setPriority(int newPriority);
取得優先級:public final int getPriority();
2. 優先級相關常量:
最高優先級:public final static int MAX_PRIORITY = 10;
中等優先級:public final static int NORM_PRIORITY = 5;
最低優先級:public final static int MIN_PRIORITY = 1;
3. 理論上,會根據設置的優先級進行線程的啟動運行;
主線程,屬于一般優先級。
1. 同步問題的引出:多個線程需要訪問統一資源;
2. 同步代碼塊執行效率要低于異步,同步代碼塊使用:synchronized關鍵字
3. 異步執行效率高,但數據不準確;同步代碼執行效率慢,但會保證數據的有效性,同時線程安全。
4. 死鎖:(了解) 如果程序中出現過多同步,將會產生死鎖問題;
---下一篇,線程中的生產者與消費者理解--線程的應用場景之一
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。