Java中sleep()與wait()的區(qū)別總結(jié)
前言
對于sleep()方法,我們首先要知道該方法是屬于Thread類中的。而wait()方法,則是屬于Object類中的。
sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間,讓出cpu該其他線程,但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時(shí)間到了又會自動(dòng)恢復(fù)運(yùn)行狀態(tài)。
在調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。
而當(dāng)調(diào)用wait()方法的時(shí)候,線程會放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象調(diào)用notify()方法后本線程才進(jìn)入對象鎖定池準(zhǔn)備
獲取對象鎖進(jìn)入運(yùn)行狀態(tài)。
什么意思呢?
舉個(gè)列子說明:
/**
*
*/
package com.b510.test;
/**
* java中的sleep()和wait()的區(qū)別
* @author Hongten
* @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()方法,線程會放棄對象鎖,進(jìn)入等待此對象的等待鎖定池
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()方法后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲取對象鎖進(jìn)入運(yù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í)行指定的時(shí)間,讓出cpu該其他線程,
//但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時(shí)間到了又會自動(dòng)恢復(fù)運(yùn)行狀態(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!!!");
}
}
}
}
運(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!!!
如果注釋掉代碼:
TestD.class.notify();
運(yùn)行效果:
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!!
且程序一直處于掛起狀態(tài)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Java運(yùn)行時(shí)jar終端輸出的中文日志亂碼兩種解決方式
jar包啟動(dòng),今天java開發(fā)過來找,說jar包啟動(dòng)日志是亂碼,這篇文章主要給大家介紹了關(guān)于Java運(yùn)行時(shí)jar終端輸出的中文日志亂碼的兩種解決方式,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
MyBatis簡介與配置MyBatis+Spring+MySql的方法
MyBatis 是一個(gè)可以自定義SQL、存儲過程和高級映射的持久層框架。這篇文章主要介紹了MyBatis簡介與配置MyBatis+Spring+MySql的方法,需要的朋友可以參考下2017-04-04
Spring的BeanFactoryPostProcessor接口示例代碼詳解
這篇文章主要介紹了Spring的BeanFactoryPostProcessor接口,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
SpringBoot服務(wù)獲取Pod當(dāng)前IP的兩種方案
在 Kubernetes 集群中,Spring Boot 服務(wù)獲取 Pod 當(dāng)前 IP 的方案主要有兩種,通過環(huán)境變量注入 或 通過 Java 代碼動(dòng)態(tài)獲取網(wǎng)絡(luò)接口 IP,下面我們來看看具體實(shí)現(xiàn)方法吧2025-06-06
springboot3生成本地文件url的實(shí)現(xiàn)示例
本文主要介紹了springboot3生成本地文件url的實(shí)現(xiàn)示例,從而提供一種高效的文件管理方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
Gradle中Maven倉庫配置的實(shí)現(xiàn)步驟
在Java/Kotlin 項(xiàng)目的構(gòu)建過程中,依賴管理是核心環(huán)節(jié)之一,而Maven 倉庫是最常見的依賴來源,本文就來詳細(xì)的介紹一下Gradle中Maven倉庫配置,感興趣的可以了解一下2025-09-09

