国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Object.wait()與Object.notify()的用法詳細(xì)解析

2019-11-26 15:58:59
字體:
供稿:網(wǎng)友

wait、notify和notifyAll方法是Object類的final native方法。所以這些方法不能被子類重寫,Object類是所有類的超類,因此在程序中有以下三種形式調(diào)用wait等方法。

復(fù)制代碼 代碼如下:

wait();//方式1:
this.wait();//方式2:
super.wait();//方式3

void notifyAll()
解除所有那些在該對象上調(diào)用wait方法的線程的阻塞狀態(tài)。該方法只能在同步方法或同步塊內(nèi)部調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個IllegalMonitorStateException異常。

void notify()
隨機選擇一個在該對象上調(diào)用wait方法的線程,解除其阻塞狀態(tài)。該方法只能在同步方法或同步塊內(nèi)部調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個IllegalMonitorStateException異常。

void wait()
導(dǎo)致線程進入等待狀態(tài),直到它被其他線程通過notify()或者notifyAll喚醒。該方法只能在同步方法中調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個IllegalMonitorStateException異常。

void wait(long millis)和void wait(long millis,int nanos)
導(dǎo)致線程進入等待狀態(tài)直到它被通知或者經(jīng)過指定的時間。這些方法只能在同步方法中調(diào)用。如果當(dāng)前線程不是鎖的持有者,該方法拋出一個IllegalMonitorStateException異常。

Object.wait()和Object.notify()和Object.notifyall()必須寫在synchronized方法內(nèi)部或者synchronized塊內(nèi)部,這是因為:這幾個方法要求當(dāng)前正在運行object.wait()方法的線程擁有object的對象鎖。即使你確實知道當(dāng)前上下文線程確實擁有了對象鎖,也不能將object.wait()這樣的語句寫在當(dāng)前上下文中。如:

復(fù)制代碼 代碼如下:

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

    }
}


程序運行會報錯,運行結(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)該是
復(fù)制代碼 代碼如下:

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 手机| 登封市| 车致| 福清市| 织金县| 屏东市| 青河县| 临颍县| 万源市| 北川| 肥乡县| 东乌珠穆沁旗| 成安县| 和政县| 柞水县| 林口县| 招远市| 胶州市| 青龙| 尤溪县| 香格里拉县| 阳新县| 通州市| 台东县| 盐城市| 涟源市| 凤翔县| 大化| SHOW| 鄯善县| 阿克| 昌黎县| 和林格尔县| 陕西省| 会理县| 电白县| 施秉县| 高陵县| 牙克石市| 略阳县| 略阳县|