欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java線程中常用操作

 更新時(shí)間:2022年05月18日 09:53:02   作者:淵渟岳  
這篇文章主要為大家詳細(xì)介紹了一下Java線程中的一些常用操作,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下

線程的常用操作

設(shè)置線程名字:setName()

獲取線程名稱:getName()

線程唯一Id:getId()

//?自定義線程名稱
String?threadName?=?"threadName";
//?構(gòu)造方法方式
Thread?thread?=?new?Thread(()?->?{
????System.out.println("線程名="?+?Thread.currentThread().getName());
},threadName);
//?set方法方式
//?thread.setName(threadName);
System.out.println("線程唯一Id="?+?thread.getId());

線程啟動(dòng):start()

判斷線程是否存活:isAlive()

//?線程啟動(dòng)
thread.start();
System.out.println("是否為存活線程="?+?thread.isAlive());

線程方法:run() /call()

線程啟動(dòng)后會(huì)去調(diào)用的方法。線程要做什么就在run/call方法寫,不需要直接調(diào)用,線程啟動(dòng)后自己會(huì)去調(diào)用run() /call()。如果程序沒有啟動(dòng)線程直接調(diào)用run/call,那么就不屬于多線程編程,是屬于當(dāng)前線程直接調(diào)用普通方法一樣。

獲取當(dāng)前線程對(duì)象:currentThread()

操作當(dāng)前線程的非static方法,得先拿到線程對(duì)象才可以

//?獲取當(dāng)前線程對(duì)象
Thread?currentThread?=?Thread.currentThread();
//?對(duì)當(dāng)前線程做一些操作
System.out.println(currentThread.getName());
try?{
????//?sleep?靜態(tài)方法則不需要
????Thread.sleep(1000);
}?catch?(InterruptedException?e)?{
????e.printStackTrace();
}

關(guān)于線程的狀態(tài)控制(生命周期)的操作可以參考上一篇文章。

守護(hù)線程(后臺(tái)線程)

普通線程(用戶線程)的守護(hù)者,守護(hù)線程的任務(wù)是為其他的線程提供服務(wù)。如果進(jìn)程中沒有了用戶線程,那么守護(hù)線程也就沒有存在的意義,JVM也隨之結(jié)束。典型的守護(hù)線程有JVM的垃圾回收線程,操作系統(tǒng)的啟動(dòng)也會(huì)啟動(dòng)各種模塊的守護(hù)線程。

設(shè)置線程為守護(hù)線程:setDaeman()

注意:該方法必須在start() 方法之前調(diào)用

public?static?void?main(String[]?args)?{
????Thread?thread?=?new?Thread(()?->?{
????????System.out.println("線程名="+Thread.currentThread().getName());
????????try?{
????????????Thread.sleep(1000);
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????????//?這一句不會(huì)打印出來,因?yàn)閙ain線程(目前唯一的普通線程)等待1秒后已經(jīng)結(jié)束了
????????System.out.println("守護(hù)線程的狀態(tài)="?+?Thread.currentThread().getState());
????});
????//?守護(hù)線程
????thread.setDaemon(true);
????//?線程啟動(dòng)
????thread.start();
????System.out.println("是否為守護(hù)線程="?+?thread.isDaemon());
}

線程串行化

執(zhí)行join() 方法的線程進(jìn)入等待喚醒狀態(tài)(WAITING),直到調(diào)用該方法的線程結(jié)束后再由等待喚醒狀態(tài)轉(zhuǎn)為可運(yùn)行狀態(tài)(RUNNABLE)。join() 方法是Thread類中的方法,其底層是使用wait() 方法來實(shí)現(xiàn)線程等待,待線程isAlive()為false 時(shí)才

實(shí)現(xiàn)線程的串行化:一個(gè)線程調(diào)用另一個(gè)線程對(duì)象的join() 來實(shí)現(xiàn)線程串行化執(zhí)行。

舉個(gè)例子:一道好菜

public?class?DemoCooking?{
????
????public?static?void?main(String[]?args)?{
????????Thread?mainThread?=?Thread.currentThread();
????????//?1.買菜
????????Thread?buyThread?=?new?Thread(new?CookingThread(mainThread,"買菜"),"buyThread");
????????//?2.洗菜
????????Thread?washThread?=?new?Thread(new?CookingThread(buyThread,"洗菜"),"washThread");
????????//?3.切菜
????????Thread?cutThread?=?new?Thread(new?CookingThread(washThread,"切菜"),"cutThread");
????????//?4.炒菜
????????Thread?scrambleThread?=?new?Thread(new?CookingThread(cutThread,"炒菜"),"scrambleThread");

????????//?不受線程啟動(dòng)順序的影響
????????scrambleThread.start();
????????washThread.start();
????????cutThread.start();
????????buyThread.start();
????????
????????// main線程先執(zhí)行完才可以開始:買菜
????????System.out.println("開始準(zhǔn)備……");
????}

????public?static?class?CookingThread?implements?Runnable{
????????private?final?Thread?thread;
????????private?final?String?job;

????????public?CookingThread(Thread?thread,?String?job){
????????????this.thread?=?thread;
????????????this.job?=?job;
????????}
????????@Override
????????public?void?run()?{
????????????String?name?=?Thread.currentThread().getName()+":";
????????????try?{
????????????????thread.join();

????????????????System.out.println(name?+?job?+?"開始");
????????????????Thread.sleep(1000);
????????????????System.out.println(name?+?job?+?"結(jié)束");
????????????????Thread.sleep(1000);?//?偷懶下
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}
????????}
????}
}

執(zhí)行結(jié)果:main > buyThread > washThread > cutThread > scrambleThread > 結(jié)束

開始準(zhǔn)備……
buyThread:買菜開始
buyThread:買菜結(jié)束
washThread:洗菜開始
washThread:洗菜結(jié)束
cutThread:切菜開始
cutThread:切菜結(jié)束
scrambleThread:炒菜開始
scrambleThread:炒菜結(jié)束

線程優(yōu)先級(jí)

設(shè)置當(dāng)前線程的優(yōu)先級(jí),線程優(yōu)先級(jí)越高,線程可能獲得執(zhí)行的次數(shù)越多,Java線程的優(yōu)先級(jí)用整數(shù)表示,優(yōu)先級(jí)的范圍為1-10,默認(rèn)為5。

setPriority(int)方法:設(shè)置線程的優(yōu)先級(jí)。

getPriority方法:獲取線程的優(yōu)先級(jí)。

public?static?void?main(String[]?args)?{

????Thread?thread?=?new?Thread(()?->?{
????????System.out.println("線程1");
????});
????thread.setPriority(10);
????Thread?thread1?=?new?Thread(()?->?{
????????System.out.println("線程2");
????});
????thread1.setPriority(1);
????thread.start();
????thread1.start();

????System.out.println("線程默認(rèn)的優(yōu)先級(jí)為="?+?Thread.currentThread().getPriority());

}

線程中斷

使用interrupt() 方法設(shè)置線程中斷標(biāo)志=true,讓線程受到“阻塞”時(shí)拋出一個(gè)中斷信號(hào)。如果線程處于阻塞、等待喚醒或超時(shí)等待狀態(tài)(Object.wait, Thread.join和Thread.sleep)時(shí),那么它將接收到一個(gè)中斷異常(InterruptedException),從而提前被結(jié)束該狀態(tài)。反之,如果線程是處于“可運(yùn)行”(RUNNABLE)狀態(tài),那么中斷標(biāo)志將沒有作用。

案例一:線程中斷有效

public?static?void?main(String[]?args)?{
????Thread?thread?=?new?Thread(()?->?{
????????System.out.println("線程1");
????????try?{
????????????//?鬧鐘1分鐘后響
????????????Thread.sleep(60000);
????????????System.out.println("鬧鐘響了");
????????}?catch?(InterruptedException?e)?{
????????????//?提前退出超時(shí)等待狀態(tài)
????????????System.out.println("發(fā)生異常,提前醒了,鬧鐘沒響手動(dòng)關(guān)了");
????????}

????????System.out.println("繼續(xù)執(zhí)行該線程的后續(xù)程序……");

????});
????thread.setPriority(1);
????thread.start();
????thread.interrupt();
????System.out.println("main線程將thread?終端狀態(tài)設(shè)置為?"+thread.isInterrupted());
}

執(zhí)行結(jié)果:

main線程將thread 終端狀態(tài)設(shè)置為 true
線程1
發(fā)生異常,提前醒了,鬧鐘沒響手動(dòng)關(guān)了
繼續(xù)執(zhí)行該線程的后續(xù)程序……

案例二:線程中斷無效

public?static?void?main(String[]?args)?{
????Thread?thread1?=?new?Thread(()?->?{
????????System.out.println("線程"?+?Thread.currentThread().getName());
????????while?(true)?{
????????????System.out.print(Thread.currentThread().getState()?+?"\t");
????????}
????});
????thread1.start();
????thread1.interrupt();
}

執(zhí)行結(jié)果:線程一直打印自己的狀態(tài)為RUNNABLE。

以上就是詳解Java線程中常用操作的詳細(xì)內(nèi)容,更多關(guān)于Java線程操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot 1.5.2 集成kafka的簡(jiǎn)單例子

    springboot 1.5.2 集成kafka的簡(jiǎn)單例子

    本篇文章主要介紹了springboot 1.5.2 集成kafka的簡(jiǎn)單例子 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Java中的ReentrantLock使用解析

    Java中的ReentrantLock使用解析

    這篇文章主要介紹了Java中的ReentrantLock使用解析,ReentrandLock即可重入鎖,可重入鎖解決的是重入鎖定的問題,重入鎖定指的是當(dāng)一個(gè)線程執(zhí)行邏輯時(shí),需要兩次獲取鎖,而該鎖不可重入就會(huì)導(dǎo)致內(nèi)部嵌套無法獲取鎖導(dǎo)致Reentrance Lockout發(fā)生,需要的朋友可以參考下
    2023-11-11
  • java Scanner輸入數(shù)字、字符串過程解析

    java Scanner輸入數(shù)字、字符串過程解析

    這篇文章主要介紹了java Scanner輸入數(shù)字、字符串過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼

    Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼

    java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java類的加載過程以及類加載器的分析

    java類的加載過程以及類加載器的分析

    這篇文章給大家詳細(xì)講述了java類的加載過程以及類加載器的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友可以學(xué)習(xí)下。
    2018-08-08
  • mybatis中foreach嵌套if標(biāo)簽方式

    mybatis中foreach嵌套if標(biāo)簽方式

    這篇文章主要介紹了mybatis中foreach嵌套if標(biāo)簽方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Intellij IDEA調(diào)試技巧的深入講解

    Intellij IDEA調(diào)試技巧的深入講解

    這篇文章主要給大家介紹了關(guān)于Intellij IDEA調(diào)試技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 區(qū)塊鏈java代碼實(shí)現(xiàn)

    區(qū)塊鏈java代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了區(qū)塊鏈java代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java中的自旋鎖spinlock詳解

    Java中的自旋鎖spinlock詳解

    這篇文章主要介紹了Java中的自旋鎖spinlock詳解,自旋鎖就是循環(huán)嘗試獲取鎖,不會(huì)放棄CPU時(shí)間片,減傷cup上下文切換,缺點(diǎn)是循環(huán)會(huì)消耗cpu,需要的朋友可以參考下
    2024-01-01

最新評(píng)論