詳解Java中的sleep()和wait()的區(qū)別
詳解Java中的sleep()和wait()的區(qū)別
對(duì)于sleep()方法,我們首先要知道該方法是屬于Thread類(lèi)中的。而wait()方法,則是屬于Object類(lèi)中的。
sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間,讓出cpu該其他線(xiàn)程,但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)。
在調(diào)用sleep()方法的過(guò)程中,線(xiàn)程不會(huì)釋放對(duì)象鎖。
而當(dāng)調(diào)用wait()方法的時(shí)候,線(xiàn)程會(huì)放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象調(diào)用notify()方法后本線(xiàn)程才進(jìn)入對(duì)象鎖定池準(zhǔn)備
獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。
什么意思呢?
舉個(gè)列子說(shuō)明:
/**
*
*/
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()方法,線(xiàn)程會(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()方法后本線(xiàn)程才進(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()
//方法,則線(xiàn)程永遠(yuǎn)處于掛起狀態(tài)。
try {
//sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間,讓出cpu該其他線(xiàn)程,
//但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時(shí)間到了又會(huì)自動(dòng)恢復(fù)運(yùn)行狀態(tài)。
//在調(diào)用sleep()方法的過(guò)程中,線(xiàn)程不會(huì)釋放對(duì)象鎖。
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread2 is going on....");
System.out.println("thread2 is over!!!");
}
}
}
}
運(yùn)行效果:
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();
運(yùn)行效果:
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!!
且程序一直處于掛起狀態(tài)。
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽(tīng)用戶(hù)狀態(tài)的實(shí)例代碼
這篇文章主要介紹了Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽(tīng)用戶(hù)狀態(tài)的實(shí)例代碼,需要的朋友可以參考下2017-12-12
Java設(shè)計(jì)模式編程之解釋器模式的簡(jiǎn)單講解
這篇文章主要介紹了Java設(shè)計(jì)模式編程之解釋器模式的講解,解釋器設(shè)計(jì)模式要注意其引發(fā)的性能問(wèn)題,需要的朋友可以參考下2016-04-04
java中基本注解的知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于java中基本注解的知識(shí)點(diǎn)總結(jié),有需要的朋友們可以跟著學(xué)習(xí)下。2021-06-06
微信小程序獲取手機(jī)號(hào)的完整實(shí)例(Java后臺(tái)實(shí)現(xiàn))
我們?cè)谧鲂〕绦蜷_(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)涉及到用戶(hù)身份的問(wèn)題,最普遍的就是我們要獲取用戶(hù)的手機(jī)號(hào)碼,下面這篇文章主要給大家介紹了關(guān)于微信小程序獲取手機(jī)號(hào)的完整實(shí)例,后臺(tái)由Java實(shí)現(xiàn),需要的朋友可以參考下2022-06-06
Spring Boot使用Druid和監(jiān)控配置方法
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,并且能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。下面來(lái)說(shuō)明如何在 Spring Boot 中配置使用Druid2017-04-04
Spring 定時(shí)任務(wù)@Scheduled 注解中的 Cron 表達(dá)式詳解
Cron 表達(dá)式是一種用于定義定時(shí)任務(wù)觸發(fā)時(shí)間的字符串表示形式,它由七個(gè)字段組成,分別表示秒、分鐘、小時(shí)、日期、月份、星期和年份,這篇文章主要介紹了Spring 定時(shí)任務(wù)@Scheduled 注解中的 Cron 表達(dá)式,需要的朋友可以參考下2023-07-07

