Object.wait()與Object.notify()的用法詳細(xì)解析
wait、notify和notifyAll方法是Object類的final native方法。所以這些方法不能被子類重寫,Object類是所有類的超類,因此在程序中有以下三種形式調(diào)用wait等方法。
wait();//方式1:
this.wait();//方式2:
super.wait();//方式3
void notifyAll()
解除所有那些在該對(duì)象上調(diào)用wait方法的線程的阻塞狀態(tài)。該方法只能在同步方法或同步塊內(nèi)部調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個(gè)IllegalMonitorStateException異常。
void notify()
隨機(jī)選擇一個(gè)在該對(duì)象上調(diào)用wait方法的線程,解除其阻塞狀態(tài)。該方法只能在同步方法或同步塊內(nèi)部調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個(gè)IllegalMonitorStateException異常。
void wait()
導(dǎo)致線程進(jìn)入等待狀態(tài),直到它被其他線程通過notify()或者notifyAll喚醒。該方法只能在同步方法中調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個(gè)IllegalMonitorStateException異常。
void wait(long millis)和void wait(long millis,int nanos)
導(dǎo)致線程進(jìn)入等待狀態(tài)直到它被通知或者經(jīng)過指定的時(shí)間。這些方法只能在同步方法中調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個(gè)IllegalMonitorStateException異常。
Object.wait()和Object.notify()和Object.notifyall()必須寫在synchronized方法內(nèi)部或者synchronized塊內(nèi)部,這是因?yàn)椋哼@幾個(gè)方法要求當(dāng)前正在運(yùn)行object.wait()方法的線程擁有object的對(duì)象鎖。即使你確實(shí)知道當(dāng)前上下文線程確實(shí)擁有了對(duì)象鎖,也不能將object.wait()這樣的語句寫在當(dāng)前上下文中。如:
package edu.sjtu.erplab.ObjectTest;
class A
{
public synchronized void printThreadInfo() throws InterruptedException
{
Thread t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
public class ObjectWaitTest {
public static void main(String args[])
{
A a=new A();
//因?yàn)閜rintThreadInfo()方法拋出InterruptedException異常,所以這里必須使用try-catch塊
try {
a.printThreadInfo();
a.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序運(yùn)行會(huì)報(bào)錯(cuò),運(yùn)行結(jié)果如下:
ThreadID:1, ThreadName:main
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
正確的寫法應(yīng)該是
package edu.sjtu.erplab.ObjectTest;
class A
{
public synchronized void printThreadInfo() throws InterruptedException
{
Thread t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait();//一直等待
this.wait(1000);//等待1000ms
// super.wait(1000);
}
}
public class ObjectWaitTest {
public static void main(String args[])
{
A a=new A();
//因?yàn)閜rintThreadInfo()方法拋出InterruptedException異常,所以這里必須使用try-catch塊
try {
a.printThreadInfo();
//a.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
相關(guān)文章
mybatis generator 使用方法教程(生成帶注釋的實(shí)體類)
下面小編就為大家?guī)硪黄猰ybatis generator 使用方法教程(生成帶注釋的實(shí)體類)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式
這篇文章主要介紹了Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Springboot上傳文件時(shí)提示405問題及排坑過程
這篇文章主要介紹了Springboot上傳文件時(shí)提示405問題及排坑過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
SpringBoot實(shí)現(xiàn)接口防刷的五種方案
接口防刷是保障系統(tǒng)安全與穩(wěn)定性的重要措施,惡意的高頻請(qǐng)求不僅會(huì)消耗服務(wù)器資源,還可能導(dǎo)致數(shù)據(jù)異常,甚至系統(tǒng)癱瘓,本文將介紹在SpringBoot框架下實(shí)現(xiàn)接口防刷的5種技術(shù)方案,需要的朋友可以參考下2025-04-04
基于Java的MathML轉(zhuǎn)圖片的方法(示例代碼)
最近接到一個(gè)新需求mathML轉(zhuǎn)圖片怎么實(shí)現(xiàn)呢?剛開始還真是蒙圈了,不知道怎么實(shí)現(xiàn),今天小編記錄一種基于Java的MathML轉(zhuǎn)圖片的方法,感興趣的朋友一起看看吧2021-06-06

