日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > Java Thread(線程)案例詳解sleep和wait的區(qū)別

Java Thread(線程)案例詳解sleep和wait的區(qū)別

來源:程序員人生   發(fā)布時間:2017-02-16 09:04:50 閱讀次數(shù):3641次

學(xué)習(xí)Java的同學(xué)注意了!??! 
學(xué)習(xí)進(jìn)程中遇到甚么問題或想獲得學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交換群,群號碼:183993990  我們1起學(xué)Java!


F區(qū)分


sleep()方法
  sleep()使當(dāng)前線程進(jìn)入停滯狀態(tài)(阻塞當(dāng)前線程),讓出CUP的使用、目的是不讓當(dāng)前線程獨(dú)自霸占該進(jìn)程所獲的CPU資源,以留1定時間給其他線程履行的機(jī)會;
   sleep()是Thread類的Static(靜態(tài))的方法;因此他不能改變對象的機(jī)鎖,所以當(dāng)在1個Synchronized塊中調(diào)用Sleep()方法是,線程雖然休眠了,但是對象的機(jī)鎖并木有被釋放,其他線程沒法訪問這個對象(即便睡著也持有對象鎖)。
  在sleep()休眠時間期滿后,該線程不1定會立即履行,這是由于其它線程可能正在運(yùn)行而且沒有被調(diào)度為放棄履行,除非此線程具有更高的優(yōu)先級。 
   
wait()方法
  wait()方法是Object類里的方法;當(dāng)1個線程履行到wait()方法時,它就進(jìn)入到1個和該對象相干的等待池中,同時失去(釋放)了對象的機(jī)鎖(暫時失去機(jī)鎖,wait(long timeout)超時時間到后還需要返還對象鎖);其他線程可以訪問;
  wait()使用notify或notifyAlll或指定睡眠時間來喚醒當(dāng)前等待池中的線程。
  wiat()必須放在synchronized block中,否則會在program runtime時扔出”java.lang.IllegalMonitorStateException“異常。


 
  所以sleep()和wait()方法的最大區(qū)分是:
    sleep()睡眠時,保持對象鎖,依然占有該鎖;
    而wait()睡眠時,釋放對象鎖。
  但是wait()和sleep()都可以通過interrupt()方法打斷線程的暫停狀態(tài),從而使線程立刻拋出InterruptedException(但不建議使用該方法)。
復(fù)制代碼

F代碼

復(fù)制代碼
/**
 * Thread sleep和wait區(qū)分
 * @author DreamSea 
 * 2012⑴⑴5
 */
public class ThreadTest implements Runnable {
    int number = 10;

    public void firstMethod() throws Exception {
        synchronized (this) {
            number += 100;
            System.out.println(number);
        }
    }

    public void secondMethod() throws Exception {
        synchronized (this) {
            /**
             * (休息2S,阻塞線程)
             * 以驗(yàn)證當(dāng)前線程對象的機(jī)鎖被占用時,
             * 是不是被可以訪問其他同步代碼塊
             */
            Thread.sleep(2000);
            //this.wait(2000);
            number *= 200;
        }
    }

    @Override
    public void run() {
        try {
            firstMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadTest threadTest = new ThreadTest();
        Thread thread = new Thread(threadTest);
        thread.start();
        threadTest.secondMethod();
    }
}
復(fù)制代碼
使用Sleep()方法輸出結(jié)果:【顯示輸出】
使用Sleep()方法輸出結(jié)果
使用Wait()方法輸出結(jié)果:【顯示輸出】
使用wait()方法輸出結(jié)果
我們來大致分析1下此段代碼,main()方法中實(shí)例化ThreadTest并啟動該線程,然后調(diào)用該線程的1個方法(secondMethod()),由于在主線程中調(diào)用方法,所以調(diào)用的普通方法secondMethod())會先被履行(但其實(shí)不是普通方法履行終了該對象的線程方法才履行,普通方法履行進(jìn)程中,該線程的方法也會被履行,他們是交替履行的,只是在主線程的普通方法會先被履行而已),所以程序運(yùn)行時會先履行secondMethod(),而secondMethod()方法代碼片斷中有synchronized block,因此secondMethod方法被履行后,該方法會占有該對象機(jī)鎖致使該對象的線程方法1直處于阻塞狀態(tài),不能履行,直到secondeMethod釋放鎖;
使用Thread.sleep(2000)方法時,由于sleep在阻塞線程的同時,并持有該對象鎖,所以該對象的其他同步線程(secondMethod())沒法履行,直到synchronized block履行終了(sleep休眠終了),secondMethod()方法才可以履行,因此輸出結(jié)果為number*200+100;
使用this.wait(2000)方法時,secondMethod()方法被履行后也鎖定了該對象的機(jī)鎖,履行到this.wait(2000)時,該方法會休眠2S并釋當(dāng)前持有的鎖,此時該線程的同步方法會被履行(由于secondMethod持有的鎖,已被wait()所釋放),因此輸出的結(jié)果為:number+100;
【顯示流程】 
sleep()和wait()方法的區(qū)分已講授終了,若對線程有興趣的童鞋我在諾諾的問問:在main方法中最后行加入“System.out.println("number="+threadTest.number);”猜猜會輸出甚么結(jié)果。。。J
復(fù)制代碼

學(xué)習(xí)Java的同學(xué)注意了?。?! 
學(xué)習(xí)進(jìn)程中遇到甚么問題或想獲得學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交換群,群號碼:183993990  我們1起學(xué)Java!


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产视频二区 | 网曝91综合精品门事件在线 | 成人精品一区二区三区校园激情 | 亚洲图片久久 | 午夜日韩免费视频 | 五月婷婷在线观看 | 国产综合自拍 | 久久性色 | 成人免费国产 | 中文字幕一区二区三区在线视频 | 在线观看av网站永久 | 国产一区二区三区视频在线 | 成人爽a毛片一区二区免费 精品麻豆 | 97精品国产 | 日韩成人在线播放 | 久久精品免费观看 | 国产一区精品在线 | 国产精品国产三级国产 | 不卡在线一区 | 欧美精品一区二区视频 | 99精品一区二区三区 | 日干夜干| 国产免费视频 | 日韩免费在线观看视频 | 韩国一级片在线播放 | 亚洲精选在线 | 久久久久一区二区 | 国产成人精品综合 | 亚洲天堂成人 | 精品在线免费视频 | 中文字幕一区二区视频 | 欧美精品三区 | 精品在线免费看 | 欧美性爽| 国偷自产视频一区二区久 | 日韩精品在线免费观看 | 日本精品视频一区二区三区四区 | 久久99视频 | 六月婷婷久久 | 国产乱码一区二区三区 | 玖玖久久 |