您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java多線程中線程狀態有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java多線程中線程狀態有哪些”這篇文章吧。
五個狀態:新生
、就緒
、運行
、死亡
、阻塞
不推薦使用JDK提供的stop()、destroy()方法【已棄用】
推薦線程自己停止
建議用一個標志位進行終止變量,到flag=false,則終止線程運行
public class StopDemo implements Runnable { // 設置一個標志位 boolean flag = true; @Override public void run() { // 線程體使用該標志 while (flag) { System.out.println("runing...."); } } // 設置一個公共的方法停止線程,轉換標志位 public void stop() { this.flag = false; } }
sleep(時間)指定當前線程阻塞的毫秒數
sleep存在異常 Interrupted Exception
sleep時間達到后線程進入就緒狀態
sleep可以模擬網絡延時,倒計時等
每一個對象都有一個鎖,sleep不會釋放鎖(重點記下)
搶票:
public class SleepDemo implements Runnable { // 票數 private int tickeNum = 10; @Override public void run() { while (true) { if (tickeNum <= 0) { break; } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(String.format("%s --> 拿到了第%d張票", Thread.currentThread().getName(), tickeNum--)); } } public static void main(String[] args) { SleepDemo sleepDemo = new SleepDemo(); new Thread(sleepDemo, "張三").start(); new Thread(sleepDemo, "李四").start(); new Thread(sleepDemo, "王五").start(); } }
從輸出結果看,第4張票被多個人搶到了,產生了線程安全問題
public class SleepDemo2 { // 模擬倒計時 public static void countDown() { int num = 5; while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))); num--; if (num==0) { break; } } } public static void main(String[] args) { countDown(); } }
禮讓線程,讓當前正在執行的線程暫停,但不阻塞
將線程從運行狀態轉為就緒狀態
讓CPU重新調度,禮讓不一定成功!看CPU心情
public class YieldDemo { public static void main(String[] args) { MyYeild myYeild = new MyYeild(); new Thread(myYeild, "a").start(); new Thread(myYeild, "b").start(); } } class MyYeild implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + " 線程開始"); // 禮讓 Thread.yield(); System.out.println(Thread.currentThread().getName() + " 線程停止"); } }
如果a線程禮讓成功了,就會讓b線程先跑
Join合并線程,待此線程執行完成后,再執行其他線程,其他線程阻塞
可以想象成食堂插隊打飯。會讓線程阻塞,慎用。
public class JoinDemo implements Runnable { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("vip來了" + i); } } public static void main(String[] args) throws InterruptedException { JoinDemo joinDemo = new JoinDemo(); Thread thread = new Thread(joinDemo); thread.start(); // 主線程 for (int i = 0; i < 500; i++) { if (i == 200) { // 插隊 thread.join(); } System.out.println("main" + i); } } }
在主線程中的i=100的時候,vip線程進來插隊,直到vip執行完,主線程才繼續
通過一個枚舉常量:Thread.State
public class StateDemo { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("==========="); } }); // 觀察狀態 new System.out.println(thread.getState()); // 啟動后 run thread.start(); System.out.println(thread.getState()); // 只要線程不終止,就一直輸出狀態 while (thread.getState() != Thread.State.TERMINATED) { Thread.sleep(500); System.out.println(thread.getState()); } } }
Java提供一個線程調度器來監控程序中啟動后進入就緒狀態的所有線程,線程調度器按照優先級決定應該調度哪個線程來執行
線程的優先級用數字表示,范圍從1~10
Thread.MIN PRIORITY = 1;
Thread.MAX PRIORITY = 10;
Thread.NORM PRIORITY = 5;
使用以下方式改變或獲取優先級
getPriority()、setPriority(int xxx)
不一定線程優先級高的會先跑,優先級低也只是意味著獲得調度的概率低,并不是優先級低就不會被調用了,主要還是取決于CPU調度,有可能會出現性能倒置。
線程分為用戶線程和守護線程
虛擬機必須確保用戶線程執行完畢
虛擬機不用等待守護線程執行完畢
如,后臺記錄操作日志,監控內存,垃圾回收,一些等待機制等等
以上是“Java多線程中線程狀態有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。