Java多執行緒Thread類了解和使用
- 2022 年 2 月 27 日
- 筆記
- JAVA, Java執行緒學習筆記, 程式碼片段
創建執行緒的兩種方式
- extends Thread 類
public class WelComeApp {
public static void main(String[] args) {
WelcomeThread thread = new WelcomeThread();
thread.start();
System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName());
}
public static class WelcomeThread extends Thread {
@Override
public void run() {
System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName());
}
}
}
- 實現 Runnable 介面
public class WelComeApp1 {
public static void main(String[] args) {
Thread thread = new Thread(() -> System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName()));
thread.start();
System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName());
}
}
注意事項
- 一個
Thread
實例調用過start
方法後,就不能再次調用,否則會出現java.lang.IllegalThreadStateException
異常資訊
執行緒的生命周期狀態
位於Thread#State
枚舉列表出6個狀態
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
-
NEW
剛剛創建好的執行緒對象,在
Start
方法之前 -
RUNNABLE
在它的內部有兩個子狀態、
ready,running
。執行緒一定是在被cpu調度到了,再一切準備完畢下才能開始工作。那麼
READY
就是獲取到CPU資源,準備就緒,可以執行。RUNNING
表示正在程式正在執行,對應到是java
程式碼里的run
方法。 -
BLOCKED
阻塞的, 通常我們說這個形容詞都是在文件系統才用的到,這裡也可以這麼的認為,當前執行緒被一個I/O操作給阻塞住了,當前所佔的cpu資源被分配去做其他事情了!等阻塞完後,再申請CPU資源回到
RUNABLE
狀態。 -
WAITING
產生這些狀態一搬在當前執行緒調用了
Object.wait()
、Thread.join()
調用
Object.notify()/Object.notifyAll()
回到RUNABLE -
TIMED_WAITING
WAINT狀態是有等待某個其他執行緒結束,而當前狀態是帶有事件的概念在裡面,我可以等,你有時間限制。
-
TERMINATED
這沒啥好說的,當前執行緒結束。
多執行緒編程的好處與壞處
優勢
- 大大的提高了系統的吞吐率
- 能充分的利用多核處理器資源
- 使用多執行緒比使用多進程更能節省資源
風險
- 執行緒安全的問題,同一個進程內的執行緒是共享進程資源,沒有做好安全控制可能會導致數據混亂。
- 提高了編程難度,比如產生死鎖,導致程式奔潰
- 可能會加重CPU負擔,多個執行緒工作會導致上下文的切換,這也是一筆不小的開支。
參考
- 《Java多執行緒編程實戰指南》第1章