Java線程的新建和就緒狀態(tài)實(shí)例分析
本文實(shí)例講述了Java線程的新建和就緒狀態(tài)。分享給大家供大家參考,具體如下:
一 點(diǎn)睛
當(dāng)線程被創(chuàng)建啟動(dòng)以后,它既不是一啟動(dòng)就進(jìn)入執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài),在線程的生命周期中,它要經(jīng)過(guò)新建、就緒、運(yùn)行、阻塞和死亡5種狀態(tài)。當(dāng)線程啟動(dòng)后,它不可能一直霸占CPU獨(dú)自運(yùn)行,所以CPU需要在多個(gè)線程之間切換,于是線程狀態(tài)也會(huì)多次在運(yùn)行和就緒之間切換。
當(dāng)程序使用new關(guān)鍵字創(chuàng)建一個(gè)線程后,該線程就處于新建狀態(tài)。
當(dāng)線程對(duì)象調(diào)用start()方法之后,該線程就處于就緒狀態(tài),處于這個(gè)狀態(tài)的線程并沒(méi)有開始運(yùn)行,只是表示該線程可以運(yùn)行了。至于該線程何時(shí)開始運(yùn)行,取決于JVM里線程調(diào)度器的調(diào)度。
自動(dòng)線程使用start()方法,而不是run()方法,永遠(yuǎn)不要調(diào)用線程對(duì)象的run()方法。否則系統(tǒng)把線程對(duì)象當(dāng)作一個(gè)普通對(duì)象,而run()方法也是一個(gè)普通方法,而不是線程執(zhí)行體。
二 代碼
public class InvokeRun extends Thread
{
private int i ;
// 重寫run方法,run方法的方法體就是線程執(zhí)行體
public void run()
{
for ( ; i < 100 ; i++ )
{
// 直接調(diào)用run方法時(shí),Thread的this.getName返回的是該對(duì)象名字,
// 而不是當(dāng)前線程的名字。
// 使用Thread.currentThread().getName()總是獲取當(dāng)前線程名字
System.out.println(Thread.currentThread().getName()
+ " " + i); // ①
}
}
public static void main(String[] args)
{
for (int i = 0; i < 100; i++)
{
// 調(diào)用Thread的currentThread方法獲取當(dāng)前線程
System.out.println(Thread.currentThread().getName()
+ " " + i);
if (i == 20)
{
// 直接調(diào)用線程對(duì)象的run方法,
// 系統(tǒng)會(huì)把線程對(duì)象當(dāng)成普通對(duì)象,run方法當(dāng)成普通方法,
// 所以下面兩行代碼并不會(huì)啟動(dòng)兩條線程,而是依次執(zhí)行兩個(gè)run方法
new InvokeRun().run();
new InvokeRun().run();
}
}
}
}
三 運(yùn)行
......
main 93
main 94
main 95
main 96
main 97
main 98
main 99
main 0
main 1
main 2
main 3
main 4
main 5
......
四 說(shuō)明
上面程序創(chuàng)建對(duì)象后直接調(diào)用了線程對(duì)象的run()方法,程序的運(yùn)行結(jié)果是整個(gè)程序只有一個(gè)線程:主線程。
如果直接調(diào)用線程對(duì)象的run()方法,則run()方法里不能直接通過(guò)getName()方法來(lái)獲得當(dāng)前執(zhí)行線程的名字,而是需要使用Thread.currentThread()方法先獲得當(dāng)前線程,再調(diào)用線程對(duì)象的getName()方法來(lái)獲得線程的名字。
啟動(dòng)線程的正確方法是調(diào)用Thread對(duì)象的start()方法,而不是直接調(diào)用run()方法,否則就會(huì)變成單線程程序。
調(diào)用了run()方法之后,該線程已經(jīng)不再處于新建狀態(tài),不要再次調(diào)用線程對(duì)象的start()方法。
只能對(duì)處于新建狀態(tài)的線程調(diào)用start()方法,否則會(huì)引發(fā)異常。
如果希望調(diào)用子線程的start()方法后子線程立即開始執(zhí)行,程序可以使用Thread.sleep(1)來(lái)讓當(dāng)前運(yùn)行的線程(主線程)睡眠1毫秒,因?yàn)?毫秒內(nèi)CPU不會(huì)空閑,它會(huì)去執(zhí)行另一個(gè)處于就緒狀態(tài)的線程,這樣就可以讓子線程立即開始執(zhí)行。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java進(jìn)程與線程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Java檢測(cè)線程中斷狀態(tài)的方法示例
- Java線程狀態(tài)及切換、關(guān)閉線程的正確姿勢(shì)分享
- Java線程池運(yùn)行狀態(tài)監(jiān)控實(shí)現(xiàn)解析
- java中線程的狀態(tài)學(xué)習(xí)筆記
- 基于java 線程的幾種狀態(tài)(詳解)
- Java線程的生命周期和狀態(tài)控制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java實(shí)現(xiàn)監(jiān)控多個(gè)線程狀態(tài)的簡(jiǎn)單實(shí)例
- 總結(jié)Java中線程的狀態(tài)及多線程的實(shí)現(xiàn)方式
- Java多線程 線程狀態(tài)原理詳解
相關(guān)文章
java的MybatisPlus調(diào)用儲(chǔ)存過(guò)程的返回?cái)?shù)據(jù)問(wèn)題
這篇文章主要介紹了java的MybatisPlus調(diào)用儲(chǔ)存過(guò)程的返回?cái)?shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例
這篇文章主要介紹了Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例,本文講解了創(chuàng)建Socket、Socket發(fā)送數(shù)據(jù)、Socket讀取數(shù)據(jù)、關(guān)閉Socket等內(nèi)容,都是最基礎(chǔ)的知識(shí)點(diǎn),需要的朋友可以參考下2014-09-09
Java的MyBatis框架項(xiàng)目搭建與hellow world示例
MyBatis框架為Java程序的數(shù)據(jù)庫(kù)操作帶來(lái)了很大的便利,這里我們就從最基礎(chǔ)的入手,來(lái)看一下Java的MyBatis框架項(xiàng)目搭建與hellow world示例,需要的朋友可以參考下2016-06-06
SpringBoot前后端接口對(duì)接常見錯(cuò)誤小結(jié)
SpringBoot前后端接口對(duì)接工作時(shí),經(jīng)常遇到請(qǐng)求500,400等問(wèn)題,本文主要介紹了SpringBoot前后端接口對(duì)接常見錯(cuò)誤小結(jié),感興趣的可以了解一下2022-01-01
解決阿里云OSS使用URL無(wú)法訪問(wèn)圖片的兩種方法
這篇文章主要介紹了解決阿里云OSS使用URL無(wú)法訪問(wèn)圖片的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

