Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作
在Java面試的時候,經常會問到Java并發編程相關的多線程、線程池、線程鎖、線程通信等面試必考點,比如:
Java并發編程系列:Java線程池的使用方式,核心運行原理、以及注意事項
Java并發編程系列:4種常用Java線程鎖的特點,性能比較、使用場景
Java并發編程系列:CountDownLatch、Semaphore等4大并發工具類詳解
高并發編程系列:ConcurrentHashMap的實現原理(JDK1.7和JDK1.8)?
史上最強多線程面試44題和答案:線程鎖+線程池+線程同步等
今天主要分享多線程狀態流轉與通信,這也是面試中必考的基礎知識點。
多線程的基本概念
1.進程
進程是操作系統進行資源分配和調度的基本單位。
2.線程
線程是進程中的一個執行單元,負責當前進程中程序的執行,一個進程中至少有一個線程。
3.多線程
什么是多線程呢?即就是一個程序中有多個線程在同時執行。
線程的生命周期
java中每個線程都需經歷新生、就緒、運行、阻塞和死亡五種狀態,線程從新生到死亡的狀態變化稱為生命周期。
1.新建狀態
使用 new Thread 類或其子類建立一個線程對象后,該線程對象就處于新建狀態。
2.就緒狀態
調用了start()方法之后,該線程就進入就緒狀態(就緒隊列中),等待JVM里線程調度器的調度。
3.運行狀態
執行 run(),此時線程便處于運行狀態。處于運行狀態的線程最為復雜,它可以變為阻塞狀態、就緒狀態和死亡狀態。
4.阻塞狀態
如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運行狀態進入阻塞狀態。
5.死亡狀態
一個運行狀態的線程完成任務或者其他終止條件發生時,該線程就切換到終止狀態。
線程的調度策略
線程調度是指系統為線程分配處理器使用權的過程。
Java 使用的線程調度是搶占式調度,在搶占式調度下,優先級最高的任務一直執行,直到它進入等待或死亡狀態或更高優先級的任務出現,優先級高的線程比優先級低的線程優先執行。
在Java多線程環境中,為保證所有線程的執行能按照一定的規則執行,JVM實現了一個線程調度器,它定義了線程調度的策略。 在 JVM 中體現為讓可運行池中優先級高的線程擁有CPU 使用權。
線程之間的通信與協作
上面比較清楚的顯示了線程的狀態流轉,其實重點主要是掌握運行、阻塞、就緒之間的通信機制。
1.sleep()和yield()和join()
1)sleep()方法作用:讓當前線程睡眠一段時間,期間不會釋放任何持有的鎖。
2) yield()方法作用:讓出該線程的時間片給其它線程。線程調用了yield()方法,表示放棄當前獲得的CPU時間片,回到就緒狀態。最后由線程調度重新選擇就緒狀態的線程分配CPU資源。
3)join()方法作用:暫停當前線程,等待被調用線程指向結束之后再繼續執行。
注意:
1)sleep(long)方法僅釋放CPU使用權,鎖仍然占用。
2)調用join()的時候,當前線程不會釋放掉鎖。
2.wait()和notify() 方法和notifyAll()方法
1)wait()方法的作用:讓該線程處于等待狀態。
2)notify()方法的作用:喚醒處于wait的線程。
3)notifyAll()方法的作用:喚醒所有處于wait狀態的線程。
注意:
1)wait()方法會釋放CPU執行權 和 占有的鎖。
2) 線程調用wait()方法后,讓該線程處于等待狀態。進入這個狀態后,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒。wait和notify必須配套使用,即必須使用同一把鎖調用。
你可能也喜歡:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android远程调试的探索与实现
- 下一篇: 机器学习从理论到工程的第二步-开发环境与