亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談Java線程Thread.join方法解析

2024-07-13 10:16:34
字體:
來源:轉載
供稿:網友

join字面上是加入的意思,我們先看看join方法的解釋和實現。

/**   * Waits for this thread to die.   * 調用方線程(調用join方法的線程)執行等待操作,直到被調用的線程(join方法所屬的線程)結束,再被喚醒   * <p> An invocation of this method behaves in exactly the same   * way as the invocation   *   *   * @throws InterruptedException   *     if any thread has interrupted the current thread. The   *     <i>interrupted status</i> of the current thread is   *     cleared when this exception is thrown.   */  public final void join() throws InterruptedException {    join(0);  }

這里join是調用的

/**   * Waits at most {@code millis} milliseconds for this thread to   * die. A timeout of {@code 0} means to wait forever.   * 等待線程執行結束,或者指定的最大等待時間到了,調用方線程再次被喚醒,如果最大等待時間為0,則只能等線程執行結束,才能被喚醒。   * <p> This implementation uses a loop of {@code this.wait} calls   * conditioned on {@code this.isAlive}. As a thread terminates the   * {@code this.notifyAll} method is invoked. It is recommended that   * applications not use {@code wait}, {@code notify}, or   * {@code notifyAll} on {@code Thread} instances.   *   *    */  public final synchronized void join(long millis)  throws InterruptedException {    long base = System.currentTimeMillis();    long now = 0;    if (millis < 0) {      throw new IllegalArgumentException("timeout value is negative");    }    if (millis == 0) {      while (isAlive()) {        wait(0);      }    } else {      while (isAlive()) {        long delay = millis - now;        if (delay <= 0) {          break;        }        wait(delay);        now = System.currentTimeMillis() - base;      }    }  }

可以看到,join方法本身是通過wait方法來實現等待的,這里判斷如果線程還在運行中的話,則繼續等待,如果指定時間到了,或者線程運行完成了,則代碼繼續向下執行,調用線程就可以執行后面的邏輯了。

但是在這里沒有看到哪里調用notify或者notifyAll方法,如果沒有調用的話,那調用方線程會一直等待下去,那是哪里調用了喚醒它的方法呢?通過查證得知,原來在線程結束時,java虛擬機會執行該線程的本地exit方法,

//線程退出函數:void JavaThread::exit(bool destroy_vm, ExitType exit_type) {...//這里會處理join相關的銷毀邏輯ensure_join(this);...}//處理join相關的銷毀邏輯  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);   //這里就調用notifyAll方法,喚醒等待的線程   lock.notify_all(thread);   thread->clear_pending_exception();  }

這樣線程什么時候被喚醒就明白了。下面寫個例子看下效果。

public class JoinTest {    public static void main(String[] args) {        ThreadBoy boy = new ThreadBoy();    boy.start();      }    static class ThreadBoy extends Thread{    @Override    public void run() {            System.out.println("男孩和女孩準備出去逛街");            ThreadGirl girl = new ThreadGirl();      girl.start();            try {        girl.join();      } catch (InterruptedException e) {        e.printStackTrace();      }            System.out.println("男孩和女孩開始去逛街了");    }  }    static class ThreadGirl extends Thread{    @Override    public void run() {      int time = 5000;            System.out.println("女孩開始化妝,男孩在等待。。。");            try {        Thread.sleep(time);      } catch (InterruptedException e) {        e.printStackTrace();      }            System.out.println("女孩化妝完成!,耗時" + time);          }  }  }

執行結果為:

男孩和女孩準備出去逛街
女孩開始化妝,男孩在等待。。。
女孩化妝完成!,耗時5000
男孩和女孩開始去逛街了

就是男孩和女孩準備去逛街,女孩要化妝先,等女孩化妝完成了,再一起去逛街。

那join(time)的用法是怎么樣的呢?

public class JoinTest {    public static void main(String[] args) {        ThreadBoy boy = new ThreadBoy();    boy.start();      }    static class ThreadBoy extends Thread{    @Override    public void run() {            System.out.println("男孩和女孩準備出去逛街");            ThreadGirl girl = new ThreadGirl();      girl.start();            int time = 2000;      try {        girl.join(time);      } catch (InterruptedException e) {        e.printStackTrace();      }            System.out.println("男孩等了" + time + ", 不想再等了,去逛街了");    }  }    static class ThreadGirl extends Thread{    @Override    public void run() {      int time = 5000;            System.out.println("女孩開始化妝,男孩在等待。。。");            try {        Thread.sleep(time);      } catch (InterruptedException e) {        e.printStackTrace();      }            System.out.println("女孩化妝完成!,耗時" + time);          }  }  }

這里僅僅把join方法換成了join(time)方法,描述改了點,打印的結果是:

男孩和女孩準備出去逛街
女孩開始化妝,男孩在等待。。。
男孩等了2000, 不想再等了,去逛街了
女孩化妝完成!,耗時5000

男孩等了join(time)中的time時間,如果這個time時間到達之后,女孩所在的線程還沒執行完,則不等待了,繼續執行后面的邏輯,就是不等女孩了,自己去逛街。

由此看出,join方法是為了比較方便的實現兩個線程的同步執行,線程1執行,碰到線程2后,等待線程2執行后,再繼續執行線程1的執行,加入的意思現在就比較形象化了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲专区国产精品| 久久久久久久一区二区三区| 欧美激情2020午夜免费观看| 精品中文字幕在线| 国产91精品不卡视频| 日本久久中文字幕| 国产精品成人aaaaa网站| 欧美国产日韩一区二区三区| 欧美日韩国产一区中文午夜| 在线观看欧美成人| 日本精品视频在线观看| 韩国v欧美v日本v亚洲| 在线日韩日本国产亚洲| 亚洲欧美中文字幕| 精品久久久久久久久久ntr影视| 久久99热这里只有精品国产| 国产午夜精品全部视频播放| 日韩精品极品毛片系列视频| 亚洲日韩欧美视频一区| 国产69精品久久久久9| 国产成人jvid在线播放| 欧美在线免费看| 欧美国产在线视频| 欧美在线性视频| 777777777亚洲妇女| 91免费人成网站在线观看18| 亚洲欧洲自拍偷拍| 久久电影一区二区| 色婷婷亚洲mv天堂mv在影片| 综合网日日天干夜夜久久| 色播久久人人爽人人爽人人片视av| 国产精品美女网站| 久久久亚洲成人| 日韩av中文字幕在线| 精品国产欧美一区二区三区成人| 久久亚洲国产精品成人av秋霞| 欧美电影免费观看高清| 亚洲毛茸茸少妇高潮呻吟| 久久久精品国产网站| 久久久久久亚洲精品中文字幕| 91久久综合亚洲鲁鲁五月天| 亚洲片在线观看| 欧美成人午夜影院| 成人福利视频网| 伊人久久久久久久久久久久久| 亚洲国产又黄又爽女人高潮的| 久久精品视频在线观看| 成人免费在线视频网址| 欧美激情高清视频| 国产一区二区视频在线观看| 久久国产精品久久精品| 亚洲网站在线看| 正在播放欧美视频| 国产精品日日摸夜夜添夜夜av| 久久综合久久88| 久久理论片午夜琪琪电影网| 中文字幕在线视频日韩| 亚洲视频综合网| 欧美特级www| 国产欧美婷婷中文| 欧美日本在线视频中文字字幕| 2020国产精品视频| 亚洲成人在线视频播放| 国产色婷婷国产综合在线理论片a| 亚洲欧洲国产精品| 亚洲国产精品久久久久秋霞不卡| 日韩欧美成人精品| 欧美日韩一区二区在线| 在线一区二区日韩| 欧美激情综合亚洲一二区| 国产男女猛烈无遮挡91| 亚洲视频欧洲视频| 国产精品小说在线| 日韩在线观看免费高清| 欧美野外猛男的大粗鳮| 精品视频在线观看日韩| 国内久久久精品| 欧美成aaa人片在线观看蜜臀| 欧美诱惑福利视频| 国产精品草莓在线免费观看| 97久久久免费福利网址| 精品福利视频导航| 欲色天天网综合久久| 亚洲精品福利视频| 亚洲欧美激情四射在线日| 国产一区av在线| 97视频网站入口| 久久精品亚洲94久久精品| 久久99精品久久久久久噜噜| 久久久最新网址| 国产精品激情自拍| 亚洲欧洲第一视频| 国产做受高潮69| 欧美精品xxx| 亚洲天堂一区二区三区| 亚洲大胆美女视频| 亚洲精品在线看| 国内精品久久久久伊人av| 日韩欧美在线免费观看| 91亚洲国产精品| 亚洲国产精品久久91精品| 欧美日韩国产精品一区| 欧美激情精品久久久久久黑人| 亚洲大胆人体视频| 亚洲一区二区国产| 亚洲a区在线视频| 欧美一区二区三区精品电影| 91精品免费久久久久久久久| 亚洲影影院av| 日韩av在线网站| 国内精品久久影院| 亚洲精品永久免费精品| 国产精品91久久久久久| 亚洲一品av免费观看| 97人人做人人爱| 亚洲日韩中文字幕在线播放| 亚洲激情国产精品| 国产精品一区二区久久精品| 久久精品影视伊人网| 国产视频一区在线| 亚洲网站在线播放| 国产精品主播视频| 亚洲国产婷婷香蕉久久久久久| 97成人精品视频在线观看| 日韩69视频在线观看| 538国产精品一区二区在线| 欧美—级a级欧美特级ar全黄| 亚洲人成电影网站色…| 日韩中文字幕第一页| 亚洲第五色综合网| 久久久久久久亚洲精品| 中文字幕一区二区三区电影| 日日狠狠久久偷偷四色综合免费| 永久免费毛片在线播放不卡| 色偷偷噜噜噜亚洲男人| 国产精品视频最多的网站| 91av视频导航| 中文字幕亚洲欧美一区二区三区| 亚洲高清福利视频| 国产精品第10页| 国产精品色悠悠| 国产精品18久久久久久麻辣| 最近2019好看的中文字幕免费| 亚洲免费视频观看| 色婷婷av一区二区三区在线观看| 成人啪啪免费看| 国产精品主播视频| 精品视频—区二区三区免费| 精品国产一区二区三区四区在线观看| 亚洲精品mp4| 色综合导航网站| 欧美成人免费观看| 日韩美女主播视频| 亚洲tv在线观看| 欧美肥老太性生活视频| 亚洲国产精品久久久久秋霞不卡| 97视频网站入口| 欧美夫妻性生活xx| 欧美亚洲国产成人精品| 91在线精品播放| 国产日韩综合一区二区性色av| 国产日韩欧美在线| 国产精品444| 久久久精品视频成人|