Object.wait()與Object.notify()的用法具體解析。本站提示廣大學習愛好者:(Object.wait()與Object.notify()的用法具體解析)文章只能為提供參考,不一定能成為您想要的結果。以下是Object.wait()與Object.notify()的用法具體解析正文
wait、notify和notifyAll辦法是Object類的final native辦法。所以這些辦法不克不及被子類重寫,Object類是一切類的超類,是以在法式中有以下三種情勢挪用wait等辦法。
wait();//方法1:
this.wait();//方法2:
super.wait();//方法3
void notifyAll()
消除一切那些在該對象上挪用wait辦法的線程的壅塞狀況。該辦法只能在同步辦法或同步塊外部挪用。假如以後線程不是鎖的持有者,該辦法拋出一個IllegalMonitorStateException異常。
void notify()
隨機選擇一個在該對象上挪用wait辦法的線程,消除其壅塞狀況。該辦法只能在同步辦法或同步塊外部挪用。假如以後線程不是鎖的持有者,該辦法拋出一個IllegalMonitorStateException異常。
void wait()
招致線程進入期待狀況,直到它被其他線程經由過程notify()或許notifyAll叫醒。該辦法只能在同步辦法中挪用。假如以後線程不是鎖的持有者,該辦法拋出一個IllegalMonitorStateException異常。
void wait(long millis)和void wait(long millis,int nanos)
招致線程進入期待狀況直到它被告訴或許經由指定的時光。這些辦法只能在同步辦法中挪用。假如以後線程不是鎖的持有者,該辦法拋出一個IllegalMonitorStateException異常。
Object.wait()和Object.notify()和Object.notifyall()必需寫在synchronized辦法外部或許synchronized塊外部,這是由於:這幾個辦法請求以後正在運轉object.wait()辦法的線程具有object的對象鎖。即便你確切曉得以後高低文線程確切具有了對象鎖,也不克不及將object.wait()如許的語句寫在以後高低文中。如:
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();
//由於printThreadInfo()辦法拋出InterruptedException異常,所以這裡必需應用try-catch塊
try {
a.printThreadInfo();
a.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
法式運轉會報錯,運轉成果以下:
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)
准確的寫法應當是
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();
//由於printThreadInfo()辦法拋出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());
}
}