摘要:即調(diào)用任意對(duì)象的方法導(dǎo)致該線程阻塞,該線程不可繼續(xù)執(zhí)行,并且該對(duì)象上的鎖被釋放。將所有等待該對(duì)象的線程全部喚起。
方法簡(jiǎn)介 1. wait()
synchronized (lockObjectA) { try { lockObjectA.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }
此時(shí),代碼塊中會(huì)釋放對(duì)對(duì)象lockObjectA的鎖定,同時(shí)使lockObjectA進(jìn)行等待,直到有線程調(diào)用了它的notify()或notifyAll()方法,才繼續(xù)將lockObjectA鎖定,并繼續(xù)執(zhí)行下面程序。
即:調(diào)用任意對(duì)象的 wait() 方法導(dǎo)致該線程阻塞,該線程不可繼續(xù)執(zhí)行,并且該對(duì)象上的鎖被釋放。
synchronized (lockObjectA) { lockObjectA.notify(); }
喚醒在等待該對(duì)象同步鎖的線程(只喚醒一個(gè)),在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)。
即:調(diào)用任意對(duì)象的notify()方法則導(dǎo)致因調(diào)用該對(duì)象的 wait()方法而阻塞的線程中隨機(jī)選擇的一個(gè)解除阻塞(但要等到獲得鎖后才真正可執(zhí)行)。
將所有等待該對(duì)象的線程全部喚起。
示例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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65633.html
摘要:等待一段時(shí)間是否有線程喚醒鎖,如果沒有,超時(shí)自動(dòng)喚醒。隨機(jī)喚醒等待隊(duì)列中的等待同一個(gè)鎖的一個(gè)線程,使這個(gè)線程退出等待隊(duì)列,進(jìn)入可運(yùn)行狀態(tài)。條件隊(duì)列中是處于等待狀態(tài)的線程,等待特定條件為真。在一般情況下,總應(yīng)該調(diào)用喚醒所有需要被喚醒的線程。 方法 java.lang.Object public final native void wait() throws InterruptedExce...
摘要:用法中規(guī)定,在調(diào)用者三個(gè)方法時(shí),當(dāng)前線程必須獲得對(duì)象鎖。作用方法作用線程自動(dòng)釋放占有的對(duì)象鎖,并等待。當(dāng)生產(chǎn)者生產(chǎn)了一個(gè)數(shù)據(jù)或者消費(fèi)者消費(fèi)了一個(gè)數(shù)據(jù)之后,使用方法來通知所有等待當(dāng)前對(duì)象鎖的線程,但是一次只會(huì)有一個(gè)等待的線程能拿到鎖。 基礎(chǔ)知識(shí) 首先我們需要知道,這幾個(gè)都是Object對(duì)象的方法。換言之,Java中所有的對(duì)象都有這些方法。 public final native void...
摘要:已經(jīng)在上面有提到過,和的作用是喚醒正在的線程,是隨機(jī)喚醒線程中的一個(gè),則是喚醒全部。釋放和不釋放鎖在多線程的操作中,鎖的釋放與否是必須要清楚的,是會(huì)釋放鎖,而則不會(huì)。 wait wait方法是Object中的方法,這個(gè)方法的功能特性:1).執(zhí)行wait方法的前提是當(dāng)前線程已經(jīng)獲取到對(duì)象的鎖,也就是wait方法必須在synchronized修飾的代碼塊或者方法中使用。2).執(zhí)行wait之...
摘要:不釋放持有的鎖,釋放鎖。在調(diào)用方法前,必須持有鎖,調(diào)用喚醒,也要持有鎖。休眠一定時(shí)間后,進(jìn)入就緒狀態(tài)。這兩個(gè)都能被方法中斷當(dāng)前狀態(tài)。用法方獲取鎖判斷條件,不滿足繼續(xù)滿足執(zhí)行其他業(yè)務(wù)方獲取鎖改變條件通知為什么是而不是會(huì)一直循環(huán),直到條件滿足。 sleep和wait sleep是Thread類的方法,wait是Object的方法。 sleep可以到處使用,wait必須是在同步方法或者代碼...
摘要:在這個(gè)等待通知機(jī)制中,我們需要考慮以下四個(gè)要素。何時(shí)等待線程要求的條件不滿足就等待。是會(huì)隨機(jī)地通知等待隊(duì)列中的一個(gè)線程,而會(huì)通知等待隊(duì)列中的所有線程。 由上一篇文章你應(yīng)該已經(jīng)知道,在 破壞占用且等待條件 的時(shí)候,如果轉(zhuǎn)出賬本和轉(zhuǎn)入賬本不滿足同時(shí)在文件架上這個(gè)條件,就用死循環(huán)的方式來循環(huán)等待,核心代碼如下: // 一次性申請(qǐng)轉(zhuǎn)出賬戶和轉(zhuǎn)入賬戶,直到成功 while(!actr.apply...
閱讀 3289·2023-04-26 02:09
閱讀 2591·2021-11-24 09:39
閱讀 3284·2021-11-16 11:52
閱讀 3622·2021-10-26 09:50
閱讀 2779·2021-10-08 10:05
閱讀 2464·2021-09-22 15:25
閱讀 3308·2019-08-30 13:14
閱讀 920·2019-08-29 17:06