­

Java多執行緒Thread類了解和使用

創建執行緒的兩種方式

  1. 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());
        }
    }
}
  1. 實現 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

    這沒啥好說的,當前執行緒結束。

多執行緒編程的好處與壞處

優勢

  1. 大大的提高了系統的吞吐率
  2. 能充分的利用多核處理器資源
  3. 使用多執行緒比使用多進程更能節省資源

風險

  1. 執行緒安全的問題,同一個進程內的執行緒是共享進程資源,沒有做好安全控制可能會導致數據混亂。
  2. 提高了編程難度,比如產生死鎖,導致程式奔潰
  3. 可能會加重CPU負擔,多個執行緒工作會導致上下文的切換,這也是一筆不小的開支。

參考

  • 《Java多執行緒編程實戰指南》第1章