sleep()與wait()在Java中有什么不同?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、興化網(wǎng)絡(luò)推廣、小程序制作、興化網(wǎng)絡(luò)營銷、興化企業(yè)策劃、興化品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供興化建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
詳解Java中的sleep()和wait()的區(qū)別
對于sleep()方法,我們首先要知道該方法是屬于Thread類中的。而wait()方法,則是屬于Object類中的。
sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時間,讓出cpu該其他線程,但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時間到了又會自動恢復(fù)運行狀態(tài)。
在調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。
而當(dāng)調(diào)用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調(diào)用notify()方法后本線程才進入對象鎖定池準(zhǔn)備
獲取對象鎖進入運行狀態(tài)。
什么意思呢?
舉個列子說明:
/** * */ package com.b510.test; /** * java中的sleep()和wait()的區(qū)別 * @author Hongten Java學(xué)習(xí)交流QQ群:589809992 我們一起學(xué)Java! * @date 2013-12-10 */ public class TestD { public static void main(String[] args) { new Thread(new Thread1()).start(); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } new Thread(new Thread2()).start(); } private static class Thread1 implements Runnable{ @Override public void run(){ synchronized (TestD.class) { System.out.println("enter thread1..."); System.out.println("thread1 is waiting..."); try { //調(diào)用wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池 TestD.class.wait(); } catch (Exception e) { e.printStackTrace(); } System.out.println("thread1 is going on ...."); System.out.println("thread1 is over!!!"); } } } private static class Thread2 implements Runnable{ @Override public void run(){ synchronized (TestD.class) { System.out.println("enter thread2...."); System.out.println("thread2 is sleep...."); //只有針對此對象調(diào)用notify()方法后本線程才進入對象鎖定池準(zhǔn)備獲取對象鎖進入運行狀態(tài)。 TestD.class.notify(); //================== //區(qū)別 //如果我們把代碼:TestD.class.notify();給注釋掉,即TestD.class調(diào)用了wait()方法,但是沒有調(diào)用notify() //方法,則線程永遠(yuǎn)處于掛起狀態(tài)。 try { //sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時間,讓出cpu該其他線程, //但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時間到了又會自動恢復(fù)運行狀態(tài)。 //在調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。 Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } System.out.println("thread2 is going on...."); System.out.println("thread2 is over!!!"); } } } }
運行效果:
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!! thread1 is going on .... thread1 is over!!!
如果注釋掉代碼:
1 TestD.class.notify();
運行效果:
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!!
看完上述內(nèi)容,你們掌握sleep()與wait()在Java中有什么不同的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!