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