免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Thread.join()和synchronized關(guān)鍵字的解釋

理解了好長(zhǎng)時(shí)間哇。。。

 1     public final synchronized void join(long millis) 2     throws InterruptedException { 3         long base = System.currentTimeMillis(); 4         long now = 0; 5  6         if (millis < 0) { 7             throw new IllegalArgumentException("timeout value is negative"); 8         } 9 10         if (millis == 0) {11             while (isAlive()) {12                 wait(0);13             }14         } else {15             while (isAlive()) {16                 long delay = millis - now;17                 if (delay <= 0) {18                     break;19                 }20                 wait(delay);21                 now = System.currentTimeMillis() - base;22             }23         }24     }

Thread.join

問題1:為什么能阻塞當(dāng)前線程?

其實(shí)從源碼來說,光想做到阻塞,那個(gè)while(isAlive())就做到了。  那么這兒也先當(dāng)問題,為什么還要wait呢?如果只為了阻塞的話。

可能吧: 其實(shí)作為多線程的環(huán)境,作為設(shè)計(jì)者,第一時(shí)間一定會(huì)想到wait,因?yàn)檫@樣肯定沒問題。

問題2:為什么wait(0)運(yùn)行的結(jié)果是main線程變成了waiting狀態(tài)?(其實(shí)很好理解,但是很容易誤解)

我把調(diào)用 t.join的過程都弄到main函數(shù)里了,這樣清楚點(diǎn)。

    public static void main(String[] args) {        ThreadTest t = new ThreadTest();        t.start();        synchronized (t){            while (t.isAlive()){                try {                    t.wait(0);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }        System.out.println(Thread.currentThread().getName());        System.out.println(i);    }

因?yàn)閖oin方法是個(gè)synchroniez方法,所以想要在任何線程里調(diào)用,先獲取到t的對(duì)象再說,即上面那樣

然后t.wait(0) 很容易誤解成把線程t給wait了,其實(shí)不然。

對(duì)于main線程來說,線程t只是個(gè)同步對(duì)象。這一切的操作,都在main線程中。所以是把main線程,放到了同步對(duì)象t的等待隊(duì)列中。所以是main線程waiting狀態(tài)。

問題3:什么時(shí)候把waiting的線程notify了?

Thread.exit()方法,調(diào)用了 group.threadTerminated方法,這個(gè)細(xì)看看吧,主要是remove(t); if (nthreads == 0) {notifyAll();}

synchronized幾種不同的加鎖位置,需要獲取的鎖(監(jiān)視)對(duì)象

  • 指定加鎖對(duì)象:對(duì)給定對(duì)象加鎖,進(jìn)入同步代碼前要獲得給定對(duì)象的鎖。 記住,wait()把線程放到該對(duì)象的等待隊(duì)列之后,會(huì)釋放該對(duì)象(鎖)。
  • 直接作用于實(shí)例方法:相當(dāng)于對(duì)當(dāng)前實(shí)例加鎖,進(jìn)入同步代碼塊前需要獲得當(dāng)前實(shí)例的鎖。就像上面那樣
  • 直接作用于靜態(tài)方法:相當(dāng)于對(duì)當(dāng)前類加鎖,進(jìn)入同步代碼塊前要獲得當(dāng)前類的鎖。

其實(shí)這幾種方式的本質(zhì)是:synchronized可以作用于不同的地方,而這三種東西都可以作為同步對(duì)象(鎖)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Thread State 詳解
線程wait()和sleep()的區(qū)別
讀《Java多線程設(shè)計(jì)模式》備忘
Java 淺析 Thread.join()
java基本教程之join方法詳解 java多線程教程
一篇文章帶你徹底搞懂join的用法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服