成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java中wait(),notify(),notifyAll()方法的使用

seanHai / 463人閱讀

摘要:即調(diào)用任意對象的方法導(dǎo)致該線程阻塞,該線程不可繼續(xù)執(zhí)行,并且該對象上的鎖被釋放。將所有等待該對象的線程全部喚起。

方法簡介 1. wait()
synchronized (lockObjectA) {
try {
    lockObjectA.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

此時,代碼塊中會釋放對對象lockObjectA的鎖定,同時使lockObjectA進行等待,直到有線程調(diào)用了它的notify()或notifyAll()方法,才繼續(xù)將lockObjectA鎖定,并繼續(xù)執(zhí)行下面程序。
即:調(diào)用任意對象的 wait() 方法導(dǎo)致該線程阻塞,該線程不可繼續(xù)執(zhí)行,并且該對象上的鎖被釋放。

2. notify()
synchronized (lockObjectA) {
            lockObjectA.notify();
        }

喚醒在等待該對象同步鎖的線程(只喚醒一個),在調(diào)用此方法的時候,并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程,而且不是按優(yōu)先級。
即:調(diào)用任意對象的notify()方法則導(dǎo)致因調(diào)用該對象的 wait()方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖后才真正可執(zhí)行)。

3. notifyAll()

將所有等待該對象的線程全部喚起。

示例
package Test0315;


/**
 * Created by Cesar on 2016/3/15.
 */
public class TestWait extends Thread {
    private static Object lockObjectA = new Object();
    private int key;

    public TestWait(int key) {
        this.key = key;
    }

    @Override
    public void run() {
        if (key == 0) {
            synchronized (lockObjectA) {
                System.out.println(key + "開始等待");
                try {
                    lockObjectA.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(key + "等待結(jié)束");
                System.out.println(key + "成功鎖定A");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(key + "釋放A");
        } else if (key == 1) {
            synchronized (lockObjectA) {
                lockObjectA.notify();
            }
            System.out.println(key + "釋放了A");
        } else {
            synchronized (lockObjectA){
                System.out.println(3+"鎖定了A");
            }
        }
    }


    public static void main(String[] args) {
        TestWait wait = new TestWait(0);
        wait.setName("Test Wait");
        wait.start();
        System.out.println("主線程休眠開始");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主線程休眠結(jié)束,喚醒開始");
        TestWait wait1 = new TestWait(1);
        wait1.start();

        TestWait wait2 = new TestWait(2);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        wait2.start();
        try {
            wait2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("全部結(jié)束");
    }
}
結(jié)果
主線程休眠開始
0開始等待
主線程休眠結(jié)束,喚醒開始
1釋放了A
0等待結(jié)束
0成功鎖定A
0釋放A
3鎖定了A
全部結(jié)束

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65633.html

相關(guān)文章

  • Javawait/notify/notifyAll

    摘要:等待一段時間是否有線程喚醒鎖,如果沒有,超時自動喚醒。隨機喚醒等待隊列中的等待同一個鎖的一個線程,使這個線程退出等待隊列,進入可運行狀態(tài)。條件隊列中是處于等待狀態(tài)的線程,等待特定條件為真。在一般情況下,總應(yīng)該調(diào)用喚醒所有需要被喚醒的線程。 方法 java.lang.Object public final native void wait() throws InterruptedExce...

    terasum 評論0 收藏0
  • Javawait、notify、notifyAll使用詳解

    摘要:用法中規(guī)定,在調(diào)用者三個方法時,當前線程必須獲得對象鎖。作用方法作用線程自動釋放占有的對象鎖,并等待。當生產(chǎn)者生產(chǎn)了一個數(shù)據(jù)或者消費者消費了一個數(shù)據(jù)之后,使用方法來通知所有等待當前對象鎖的線程,但是一次只會有一個等待的線程能拿到鎖。 基礎(chǔ)知識 首先我們需要知道,這幾個都是Object對象的方法。換言之,Java中所有的對象都有這些方法。 public final native void...

    rozbo 評論0 收藏0
  • java多線程(7)wait()、notify()和notityALL()

    摘要:已經(jīng)在上面有提到過,和的作用是喚醒正在的線程,是隨機喚醒線程中的一個,則是喚醒全部。釋放和不釋放鎖在多線程的操作中,鎖的釋放與否是必須要清楚的,是會釋放鎖,而則不會。 wait wait方法是Object中的方法,這個方法的功能特性:1).執(zhí)行wait方法的前提是當前線程已經(jīng)獲取到對象的鎖,也就是wait方法必須在synchronized修飾的代碼塊或者方法中使用。2).執(zhí)行wait之...

    LiuRhoRamen 評論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之線程生命周期-wait,notify,notifyall(六)

    摘要:不釋放持有的鎖,釋放鎖。在調(diào)用方法前,必須持有鎖,調(diào)用喚醒,也要持有鎖。休眠一定時間后,進入就緒狀態(tài)。這兩個都能被方法中斷當前狀態(tài)。用法方獲取鎖判斷條件,不滿足繼續(xù)滿足執(zhí)行其他業(yè)務(wù)方獲取鎖改變條件通知為什么是而不是會一直循環(huán),直到條件滿足。 sleep和wait sleep是Thread類的方法,wait是Object的方法。 sleep可以到處使用,wait必須是在同步方法或者代碼...

    Terry_Tai 評論0 收藏0
  • [Java并發(fā)-5]用“等待-通知”機制優(yōu)化循環(huán)等待

    摘要:在這個等待通知機制中,我們需要考慮以下四個要素。何時等待線程要求的條件不滿足就等待。是會隨機地通知等待隊列中的一個線程,而會通知等待隊列中的所有線程。 由上一篇文章你應(yīng)該已經(jīng)知道,在 破壞占用且等待條件 的時候,如果轉(zhuǎn)出賬本和轉(zhuǎn)入賬本不滿足同時在文件架上這個條件,就用死循環(huán)的方式來循環(huán)等待,核心代碼如下: // 一次性申請轉(zhuǎn)出賬戶和轉(zhuǎn)入賬戶,直到成功 while(!actr.apply...

    fxp 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<