国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 达孜县| 丹巴县| 新乡市| 合水县| 东光县| 卢湾区| 唐海县| 襄汾县| 昭觉县| 许昌市| 东乡| 闻喜县| 嘉定区| 从化市| 博湖县| 浦城县| 万盛区| 裕民县| 黄浦区| 上虞市| 庐江县| 衢州市| 宜兴市| 红安县| 类乌齐县| 原平市| 沁源县| 焉耆| 林周县| 扎囊县| 新兴县| 十堰市| 海伦市| 壶关县| 威远县| 固阳县| 浦北县| 平南县| 舒城县| 新丰县| 广东省|