1.什么是線程
1.1 進程
要了解線程我們首先需要了解什么是進程?
運行的程序在操作系統中以進程的方式運行,比如說電腦打開不同的軟件,軟件就是不同的進程
1.1.1進程的組織方式
通過雙向鏈表
創建進程就是在雙向鏈表上添加PCB
銷毀一個進程就是在雙向鏈表上刪除PCB
查看所有進程就是遍歷完雙向鏈表
1.1.2進程是操作系統的一個核心概念
進程是系統分配資源的最小單位
1.1.3 進程的運行狀態
1.串行:就是一件事干完之后才去干另一件事
2.并行:兩件事一起干
3.并發:一會干這件事,一會干另一件事
2.線程和進程的區別
1.每創建一個進程,每個進程內都會有一個主線程
線程調用的是進程啟動時向操作系統申請到的資源
線程是進程的子集
2. 創建,銷毀,調度線程比進程快
3.線程之間會互相影響,進程不會
?個進程掛了?般不會影響到其他進程.但是?個線程掛了,可能把同進程內的其他線程?起帶?(整 個進程崩潰)
4.進程是系統分配資源的最?單位,線程是系統調度的最?單位。
3.創建線程
1.繼承Thread類,實現run()方法
class MyThread02 extends Thread{@Overridepublic void run() {while (true){try{Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello MyThread thread...");}}
2.實現Runnable接口,重寫run()方法
class MyRunnable01 implements Runnable{@Overridepublic void run() {while (true){try{Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello my runnable...");}}
}
3.通過匿名內部類的的方式創建Thread子類或者Runnable接口的實現類
Thread thread = new Thread() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("通過Thread匿名內部類的方法創建");}}};
Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("匿名內部類 Runnable...");}});thread.start();
4.由于Runnable接口是一個函數接口,可以通過lambda表達式的試創建,本質上就是實現了Runnable接口
Thread thread = new Thread(()->{System.out.println("通過Lambda表達式創建線程");});
4.線程的狀態
在Java層面,在系統PCB的基礎上又做了一層封裝
1.NEW: 創建了一個JAVA的線程對象,但是還沒開始執行
2.RUNNABLE:線程的狀態是運行+就緒,在系統中已經有了與之對應的PCB,隨時可以調度到CPU上執行
3.TERMINATED:線程在CPU上執行結束,系統中的PCB以毀,但是JAVA對象還在
4.WAITING:等待狀態,死等,沒有時間限制 join(),wait()
5.TIMED_WAITING:帶時間的等待狀態,如join(time),sleep(time) , wait(time)
6.BLOCK: 加入synchronized關鍵詞之后,其他線程等待鎖資源的時候出現的狀態