多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Java Thread(線程)案例詳解sleep和wait的區別

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

來源:程序員人生   發布時間:2017-02-16 09:04:50 閱讀次數:3628次

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


F區分


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


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

F代碼

復制代碼
/**
 * Thread sleep和wait區分
 * @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,阻塞線程)
             * 以驗證當前線程對象的機鎖被占用時,
             * 是不是被可以訪問其他同步代碼塊
             */
            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();
    }
}
復制代碼
使用Sleep()方法輸出結果:【顯示輸出】
使用Sleep()方法輸出結果
使用Wait()方法輸出結果:【顯示輸出】
使用wait()方法輸出結果
我們來大致分析1下此段代碼,main()方法中實例化ThreadTest并啟動該線程,然后調用該線程的1個方法(secondMethod()),由于在主線程中調用方法,所以調用的普通方法secondMethod())會先被履行(但其實不是普通方法履行終了該對象的線程方法才履行,普通方法履行進程中,該線程的方法也會被履行,他們是交替履行的,只是在主線程的普通方法會先被履行而已),所以程序運行時會先履行secondMethod(),而secondMethod()方法代碼片斷中有synchronized block,因此secondMethod方法被履行后,該方法會占有該對象機鎖致使該對象的線程方法1直處于阻塞狀態,不能履行,直到secondeMethod釋放鎖;
使用Thread.sleep(2000)方法時,由于sleep在阻塞線程的同時,并持有該對象鎖,所以該對象的其他同步線程(secondMethod())沒法履行,直到synchronized block履行終了(sleep休眠終了),secondMethod()方法才可以履行,因此輸出結果為number*200+100;
使用this.wait(2000)方法時,secondMethod()方法被履行后也鎖定了該對象的機鎖,履行到this.wait(2000)時,該方法會休眠2S并釋當前持有的鎖,此時該線程的同步方法會被履行(由于secondMethod持有的鎖,已被wait()所釋放),因此輸出的結果為:number+100;
【顯示流程】 
sleep()和wait()方法的區分已講授終了,若對線程有興趣的童鞋我在諾諾的問問:在main方法中最后行加入“System.out.println("number="+threadTest.number);”猜猜會輸出甚么結果。。。J
復制代碼

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


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚色中文 | 国产精品亚洲欧美日韩区 | 亚洲一区二区综合 | 老黄网站在线观看免费 | 国产精品一区在线麻豆 | 欧美6699| 国产欧美在线不卡 | 女网址www女影院 | 中文国产成人精品久久96 | 国内自拍在线视频高清 | 日韩欧美伊人久久大香线蕉 | 羞羞网站免费观看 | 毛片最新网址 | 欧美午夜免费一级毛片 | 国产精品嫩草影院人体模特 | asmr国产一区在线 | 亚洲人成在线影院 | 亚洲欧美日韩综合一区 | 国产精品东北一极毛片 | 国产精品a v 免费视频 | 欧美成人观看免费全部完小说 | l欧美18一19sex性 | 老女人一级全黄肉体毛片 | 日本一级黄色毛片 | 特黄色一级毛片 | 亚洲另类春色小说 | 天堂在线天堂最新版 | 亚洲在线网址 | 中文字幕在线视频在线看 | 日毛片 | 欧美另类69xxxxx极品 | 亚洲成在人线久久综合 | 高清在线亚洲精品国产二区 | 欧美军人男同69gay | 亚洲乱码一二三四五六区 | 日产一区一区三区产品 | 久久精品国产精品亚洲20 | 亚洲影院手机版777点击进入影院 | 视频在线高清完整免费观看 | 久久机热这里只有精品 | 欧美亚洲另类在线 |