您好,登錄后才能下訂單哦!
這篇文章主要介紹java中sleep()和wait()有什么區(qū)別,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
Java是一門(mén)面向?qū)ο缶幊陶Z(yǔ)言,可以編寫(xiě)桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序。
wait()是Object的方法,sleep()是Thread的方法。
wait()必須采用同步方法,不需要sleep()方法。
線程在同步方法中執(zhí)行sleep()方法,不釋放monitor鎖,wait()方法釋放monitor鎖。
短暫休眠后,sleep()方法會(huì)主動(dòng)退出阻塞,而wait()方法需要在沒(méi)有指定wait時(shí)間的情況下被其他線程中斷才能退出阻塞。
import java.text.SimpleDateFormat; import java.util.Date; public class TestSleepAndWait { public static void main(String[] args) { new Thread1().start(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } new Thread2().start(); } } class Thread1 extends Thread{ private void sout(String s){ System.out.println(s+" "+new SimpleDateFormat("HH:mm:ss:SS").format(new Date())); } @Override public void run() { sout("enter Thread1.run"); synchronized (TestSleepAndWait.class){//wait只能在同步代碼塊或者同步方法中使用 sout("Thread1 is going to wait"); try { TestSleepAndWait.class.wait(); // 這里只能使用持有鎖TestSleepAndWait.class.wait(),使用其他對(duì)象則報(bào)錯(cuò)java.lang.IllegalMonitorStateException } catch (InterruptedException e) { e.printStackTrace(); } sout("after waiting, thread1 is going on"); sout("thread1 is over"); } } } class Thread2 extends Thread{ private void sout(String s){ System.out.println(s+" "+new SimpleDateFormat("HH:mm:ss:SS").format(new Date())); } @Override public void run() { sout("enter Thread2.run"); synchronized (TestSleepAndWait.class){//wait只能在同步代碼塊或者同步方法中使用 sout("Thread2 is going to notify"); TestSleepAndWait.class.notify(); 這里只能使用持有鎖TestSleepAndWait.class sout("thread2 is going to sleep 10ms"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } sout("after sleeping, thread2 is going on"); sout("thread2 is over"); } } }
內(nèi)容擴(kuò)展:
/** * */ 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()方法,線程會(huì)放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池 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...."); //只有針對(duì)此對(duì)象調(diào)用notify()方法后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。 TestD.class.notify(); //================== //區(qū)別 //如果我們把代碼:TestD.class.notify();給注釋掉,即TestD.class調(diào)用了wait()方法,但是沒(méi)有調(diào)用notify() //方法,則線程永遠(yuǎn)處于掛起狀態(tài)。 try { //sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間,讓出cpu該其他線程, //但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)。 //在調(diào)用sleep()方法的過(guò)程中,線程不會(huì)釋放對(duì)象鎖。 Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } System.out.println("thread2 is going on...."); System.out.println("thread2 is over!!!"); } } } }
以上是“java中sleep()和wait()有什么區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。