日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 印度阿三17 2019-02-02

理解了好長時間哇。。。

 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í)從源碼來說,光想做到阻塞,那個while(isAlive())就做到了。  那么這兒也先當(dāng)問題,為什么還要wait呢?如果只為了阻塞的話。

可能吧: 其實(shí)作為多線程的環(huán)境,作為設(shè)計者,第一時間一定會想到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方法是個synchroniez方法,所以想要在任何線程里調(diào)用,先獲取到t的對象再說,即上面那樣

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

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

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

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

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

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

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多