Java線程生命周期圖文詳細(xì)講解
線程的狀態(tài)
New
- 表示線程已創(chuàng)建,沒(méi)啟動(dòng)的狀態(tài)
- 此時(shí)已經(jīng)做了一些準(zhǔn)備工作,還沒(méi)有執(zhí)行run方法中代碼
Runnable
- 調(diào)用start方法之后的狀態(tài),表示可運(yùn)行狀態(tài)(不一定正在運(yùn)行,因?yàn)檎{(diào)用start方法之后不一定立即運(yùn)行)
- 如果線程拿到CPU資源,但是突然資源被搶走,這個(gè)線程依然處于Runnable
Blocked
- 線程進(jìn)入到被synchronized修飾的代碼塊時(shí),該鎖已經(jīng)被其他線程拿走,此時(shí)該線程處于Blocked
- Blocked只針對(duì)synchronized
Waiting
- 沒(méi)有設(shè)置時(shí)間參數(shù)的Object.wait方法可使線程狀態(tài)變?yōu)閣aiting
Timed Waiting
- 相對(duì)Waiting,有了時(shí)間參數(shù)
Terminated
- 執(zhí)行完畢
- run方法正常執(zhí)行完畢
- 或者出現(xiàn)了一個(gè)沒(méi)有被捕獲的異常終止了run方法
代碼演示
- 展示線程的New、Runnable、Terminated狀態(tài)
- 線程剛被new處于NEW狀態(tài)
- 調(diào)用start方法處于RUNNABLE狀態(tài)
- 程序正在執(zhí)行處于RUNNABLE狀態(tài)而不是RUNNING
- 程序結(jié)束處于TERMINATED狀態(tài)
public class NewRunnableTerminated implements Runnable { public static void main(String[] args) { Thread thread = new Thread(new NewRunnableTerminated()); // 打印線程狀態(tài) // New System.out.println(thread.getState()); thread.start(); // Runnable System.out.println(thread.getState()); // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // Runnable System.out.println(thread.getState()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // TERMINATED System.out.println(thread.getState()); } @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println(i); } } } /* * NEW RUNNABLE RUNNABLE * TERMINATED * */
- 演示waiting、Blocked、Timed Waiting
- 中間頻繁調(diào)用sleep方法是防止代碼執(zhí)行太快,達(dá)不到應(yīng)有的效果
- 線程被調(diào)用sleep,處于TIMED_WAITING
- 當(dāng)一個(gè)線程執(zhí)行synchronized內(nèi)的代碼,另一個(gè)線程也要執(zhí)行則該線程處于BLOCKED
- 線程執(zhí)行wait方法,處于WAITING
public class BlockWaitingTimedWaiting implements Runnable{ public static void main(String[] args) { BlockWaitingTimedWaiting blockWaitingTimedWaiting = new BlockWaitingTimedWaiting(); Thread thread1 = new Thread(blockWaitingTimedWaiting); thread1.start(); Thread thread2 = new Thread(blockWaitingTimedWaiting); thread2.start(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread1.getState()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread2.getState()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread1.getState()); } @Override public void run() { syn(); } private synchronized void syn() { try { Thread.sleep(1000); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } /* * TIMED_WAITING BLOCKED WAITING * */
阻塞狀態(tài)
- 一般而言,Blocked、Waiting、Timed_waiting都被稱之為阻塞狀態(tài)
- 在阻塞狀態(tài)下,什么時(shí)候可以繼續(xù)執(zhí)行是不受控制的
到此這篇關(guān)于Java線程生命周期圖文詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java線程生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud Ribbon客戶端詳細(xì)介紹
Spring Cloud Ribbon 是一套基于 Netflix Ribbon 實(shí)現(xiàn)的客戶端負(fù)載均衡和服務(wù)調(diào)用工具。通過(guò)Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用2022-09-09mvc架構(gòu)實(shí)現(xiàn)商品的購(gòu)買(二)
這篇文章主要為大家詳細(xì)介紹了mvc架構(gòu)實(shí)現(xiàn)商品購(gòu)買功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11關(guān)于Spring自定義XML schema 擴(kuò)展的問(wèn)題(Spring面試高頻題)
今天給大家分享一道spring高頻率面試題關(guān)于Spring自定義XML schema 擴(kuò)展的問(wèn)題,今天以spring整合dubbo的實(shí)例給大家詳細(xì)講解下,感興趣的朋友跟隨小編一起看看吧2021-05-05Java TimedCache 帶時(shí)間緩存工具類詳解使用
工具類是包含集合框架、遺留的 collection 類、事件模型、日期和時(shí)間設(shè)施、國(guó)際化和各種實(shí)用工具類(字符串標(biāo)記生成器、隨機(jī)數(shù)生成器和位數(shù)組、日期Date類、堆棧Stack類、向量Vector類等)。集合類、時(shí)間處理模式、日期工具等各類常用工具包,本文將介紹帶時(shí)間緩存工具類2021-10-10Java編程生產(chǎn)者消費(fèi)者實(shí)現(xiàn)的四種方法
Java生產(chǎn)者和消費(fèi)者問(wèn)題是線程安全模型中的經(jīng)典問(wèn)題:生產(chǎn)者和消費(fèi)者在同一個(gè)時(shí)間段共用同一個(gè)存儲(chǔ)空間,生產(chǎn)者向存儲(chǔ)空間中添加產(chǎn)品呢,消費(fèi)者取走產(chǎn)品,當(dāng)存儲(chǔ)空間為空時(shí),消費(fèi)者阻塞,當(dāng)存儲(chǔ)空間滿時(shí),生產(chǎn)者阻塞2021-10-10Java詳細(xì)分析講解自動(dòng)裝箱自動(dòng)拆箱與Integer緩存的使用
裝箱就是把基本類型轉(zhuǎn)換成包裝類,拆箱就是把包裝類轉(zhuǎn)換成基本類型,下面這篇文章主要給大家介紹Java中自動(dòng)裝箱、自動(dòng)拆箱與Integer緩存,需要的朋友可以參考下2022-04-04