程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Object.wait()與Object.notify()的用法具體解析

Object.wait()與Object.notify()的用法具體解析

編輯:關於JAVA

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());
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved