java線程喚醒
1. java線程的六種狀態
Java線程的運行狀態包括六種,分別是初始狀態(NEW)、就緒狀態(RUNNABLE之READY)、運行中狀態(RUNNABLE之RUNNING)、阻塞狀態(BLOCKED)、等待狀態(WAITING)、超時等待狀態(TIMED_WAITING)與終止狀態(TERMINATED)。
當實現Runnable介面或繼承Thread類,並new一個實例,線程即進入初始狀態。線程調度程序從可運行池中選擇一個線程作為當前線程時,線程進入就緒狀態。就緒狀態的線程通過線程調度程序的調度進入運行狀態。
阻塞狀態是指線程在獲取synchronized關鍵字修飾的方法或代碼塊鎖時的狀態,此時線程暫停執行,直到獲得鎖後恢復執行。
等待狀態的線程不再分配CPU執行時間,需被顯式喚醒,否則可能無限等待。超時等待狀態的線程同樣不分配CPU執行時間,但會在達到指定時間後自動喚醒。
運行至終止狀態的線程,run()方法完成或主線程的main()方法結束,線程終止。終止狀態的線程調用start()方法會引發異常。線程一旦終止,無法復生。
在了解線程狀態的基礎上,深入學習等待隊列、同步隊列狀態及線程方法的比較,有助於更全面地掌握Java並發編程。
推薦閱讀:探討Java線程狀態的不同觀點,了解Java並發寶典,掌握Volatile關鍵字在面試中的應用技巧。
2. java中notify怎麼使用
notify(),notifyAll()都是要喚醒正在等待的線程,前者明確喚醒一個,後者喚醒全部。
當程序不明確知道下一個要喚醒的線程時,需要採用notifyAll()喚醒所有在wait池中的線程,讓它們競爭而獲取資源的執行權,但使用notifyAll()時,會出現死鎖的風險,因此,如果程序中明確知道下一個要喚醒的線程時,盡可能使用notify()而非notifyAll()。