最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程join()方法的作用和實現(xiàn)原理解析(應(yīng)用場景)

 更新時間:2021年07月05日 10:37:04   作者:java葉新東老師  
join方法主要是用于將當(dāng)前線程掛起,等待其他線程結(jié)束后在執(zhí)行當(dāng)前線程,本文通過應(yīng)用場景分析代碼示例講解java多線程join()方法的作用和實現(xiàn)原理,感興趣的朋友一起看看吧

1、join() 方法的作用

    這個方法的作用是先將當(dāng)前線程掛起,待其他線程結(jié)束后在執(zhí)行當(dāng)前線程的代碼;

2、應(yīng)用場景

比如有三個人小紅、小李、小王, 三個人相約一起去酒店吃飯,菜已經(jīng)點好了, 三個人從不同的地方出發(fā),只有三個人都到了酒店之后才會開始上菜;那么這三個人就分別代表三個線程,這三個線程執(zhí)行完之后才會執(zhí)行 “上菜” 的代碼邏輯,

代碼示例

package com.Lock;
 
/**
 * join方法示例
 * 比如有三個人小紅、小李、小王, 三個人相約一起去酒店吃飯,菜已經(jīng)點好了, 三個人從不同的地方出發(fā),只有三個人都到了酒店之后才會開始上菜;那么這三個人就分別代表三個線程,這三個線程執(zhí)行完之后才會執(zhí)行 “上菜” 的代碼邏輯,
 */
public class ConutDownLatchJoinDemo implements Runnable {
 
 
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() + "開始出發(fā)了");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "到酒店了");
 
 
    }
}
 
// 酒店線程
class Hotel2 implements  Runnable{
 
    Thread thread;
 
    public Hotel2 ( Thread thread){
        this.thread = thread;
    }
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() +"正在等待大家的到來.....");
        try {
            // 待其他線程執(zhí)行完成后在執(zhí)行下面的代碼
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("人齊了,"+Thread.currentThread().getName() +"服務(wù)員開始上菜");
    }
}
class Main2 {
    public static void main(String[] args) throws InterruptedException {
 
        Thread t1 = new Thread(new ConutDownLatchJoinDemo(), "小紅");
        Thread t2 = new Thread(new ConutDownLatchJoinDemo(), "小王");
        Thread t3 = new Thread(new ConutDownLatchJoinDemo(), "小李");
 
        // 三個人同時出發(fā)
        t1.start();
        t2.start();
        t3.start();
 
        // 酒店也開始著手準(zhǔn)備好將要上的菜
        new Thread(new Hotel2(t3),"酒店").start();
 
 
    }
}

打印結(jié)果

3、坑點

java的join方法中,這里有一個坑,就是下面這個方法

Thread.currentThread().join();

我們都知道 ,join方法的作用是阻塞,即等待線程結(jié)束,才繼續(xù)執(zhí)行。如果調(diào)用了Thread.currentThread().join(); 這個方法,那么線程一直在阻塞,無法終止。因為它自己在等待自己結(jié)束;這無疑會造成死鎖;

接下來我們來測試一把,代碼和上面的一樣,只需要改一行代碼即可,在上面的代碼的Hotel.run()方法中,將 t3.join(); 改為 Thread.currentThread().join(); 即可;

// 酒店線程
class Hotel2 implements  Runnable{
 
    Thread thread;
 
    public Hotel2 ( Thread thread){
        this.thread = thread;
    }
    @Override
    public void run() {
 
        System.out.println(Thread.currentThread().getName() +"正在等待大家的到來.....");
        try {
            //  將  t3.join(); 改為 Thread.currentThread().join();
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("人齊了,"+Thread.currentThread().getName() +"服務(wù)員開始上菜");
    }
}

運行后結(jié)果如下

所以這個方法一定不要直接使用;

4、join方法的實現(xiàn)原理

    說了這么多,也舉了這么多例子了,join方法是怎么實現(xiàn)線程等待的呢?我點進(jìn)去join方法內(nèi)部可以看到,其實它的內(nèi)部也就是調(diào)用了wait()方法,

只不過它多做了一步,用了一個循環(huán)來判斷線程是否還活著,isAlive()方法就是用來判斷線程是否還活著;

4.1、join方法實現(xiàn)原理的疑問

那么這個時候肯定有的同學(xué)就有疑問了,只看到j(luò)oin()方法調(diào)用了wait()方法,但是沒看到有調(diào)用notify() 或者 notifyAll() 系列的喚醒方法,那它是怎么喚醒的呢?如果不喚醒,那不就一直等待下去了嗎?

原來啊,在java中,Thread類線程執(zhí)行完run()方法后,一定會自動執(zhí)行notifyAll()方法

 這是notifyAll()非常重要的隱藏知識點,這個細(xì)節(jié)隱藏在Java的Native方法中,所以一般不會被人發(fā)現(xiàn)。我們觀察C/C++源碼,如下:

oid JavaThread::exit(booldestory_vm, ExitTypeexit_type);
static void ensure_join(JavaThread*thread) {
	Handle threadObj(thread, thread -> threadObj());
	ObjectLocker lock(threadObj, thread);
	thread -> clear_pending_exception();
	java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
	java_lang_Thread::set_thread(threadObj(), NULL);
     //下行執(zhí)行了notifyAll()操作
	lock.notify_all(thread);
	thread -> clear_pending_exception();
}

其中ensure_join就是執(zhí)行join()方法,等方法執(zhí)行結(jié)束時,此行代碼lock.notify_all(thread);意思是通過notifyAll()喚醒了所有等待線程。所以在使用線程的時候,要特別注意 

到此這篇關(guān)于java多線程join()方法的作用和實現(xiàn)原理的文章就介紹到這了,更多相關(guān)java多線程join()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot高可用限流三種實現(xiàn)解決方案

    Spring Boot高可用限流三種實現(xiàn)解決方案

    限流是對某一時間窗口內(nèi)的請求數(shù)進(jìn)行限制,保持系統(tǒng)的可用性和穩(wěn)定性,本文就介紹了Spring Boot高可用限流三種實現(xiàn)解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)詳解

    Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-03-03
  • IDEA中的HTTP Client使用教程

    IDEA中的HTTP Client使用教程

    這篇文章主要介紹了IDEA中的HTTP Client使用教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot使用CXF集成WebService的方法

    SpringBoot使用CXF集成WebService的方法

    這篇文章主要介紹了SpringBoot使用CXF集成WebService的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java報錯狀態(tài)碼問題

    java報錯狀態(tài)碼問題

    這篇文章主要介紹了java報錯狀態(tài)碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring Boot2.x如何自定義Endpoint

    Spring Boot2.x如何自定義Endpoint

    這篇文章主要介紹了Spring Boot2.x如何自定義Endpoint,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • MyBatis使用<foreach>標(biāo)簽like查詢報錯解決問題

    MyBatis使用<foreach>標(biāo)簽like查詢報錯解決問題

    這篇文章主要介紹了MyBatis使用<foreach>標(biāo)簽like查詢報錯解決問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 在lambda的foreach遍歷中break退出操作(lambda foreach break)

    在lambda的foreach遍歷中break退出操作(lambda foreach break)

    這篇文章主要介紹了在lambda的foreach遍歷中break退出操作(lambda foreach break),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java5種遍歷HashMap數(shù)據(jù)的寫法

    Java5種遍歷HashMap數(shù)據(jù)的寫法

    這篇文章主要介紹了Java5種遍歷HashMap數(shù)據(jù)的寫法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Java SpringMVC 異常處理SimpleMappingExceptionResolver類詳解

    Java SpringMVC 異常處理SimpleMappingExceptionResolver類詳解

    這篇文章主要介紹了SpringMVC 異常處理SimpleMappingExceptionResolver類詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

确山县| 砚山县| 丰城市| 天祝| 余姚市| 大理市| 林周县| 武威市| 奈曼旗| 寻乌县| 古蔺县| 兰考县| 大理市| 新兴县| 丰顺县| 无为县| 年辖:市辖区| 万源市| 汝州市| 磐石市| 印江| 建始县| 桐乡市| 右玉县| 庄河市| 迁安市| 蓬溪县| 洞头县| 拉萨市| 三门县| 琼中| 仪陇县| 扎赉特旗| 盐山县| 绵阳市| 济源市| 改则县| 鹿邑县| 泌阳县| 西安市| 博客|