1. 程式人生 > >Object wait notify notifyAll 方法詳解

Object wait notify notifyAll 方法詳解

wait()方法表示,放棄當前對資源的佔有權,等啊等啊,一直等到有人通知我,我才會執行後面的程式碼。

notify()方法表示,當前的執行緒已經放棄對資源的佔有, 通知等待的執行緒來獲得對資源的佔有權,但是隻有一個執行緒能夠從wait狀態中恢復,
然後繼續執行wait()後面的語句;

notifyAll()方法表示,當前的執行緒已經放棄對資源的佔有, 通知所有的等待執行緒從wait()方法後的語句開始執行。 讀出什麼區別沒有?
wait,notify,notifyAll方法必須執行在synchronized程式碼塊內

demo

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
public class WaitNotifyDemo {
	static final CountDownLatch lath = new CountDownLatch(2);
	static final CyclicBarrier lathb = new CyclicBarrier(2);
	
	private static final Object syncObj = new Object();

	static class WaitThread extends Thread {
		@Override
		public void run() {
			System.out.println("wait begin enter synchronized");
			synchronized (syncObj) {
				try {
					System.out.println("wait start");
					// 執行緒等待
					syncObj.wait();
					System.out.println("wait end");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			}
			try {
				lathb.await();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			lath.countDown();
		}
	}

	static class NotifyThread extends Thread {
		@Override
		public void run() {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("notify begin enter synchronized");
			synchronized (syncObj) {
				System.out.println("notify start");
				// 當前執行緒執行完畢後 喚醒wait執行緒
				syncObj.notify();

				System.out.println("notify end");

			}
			try {
				lathb.await();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			lath.countDown();
		}
	}

	public static void main(String[] args) throws InterruptedException, BrokenBarrierException {

		WaitThread wd = new WaitThread();
		NotifyThread nd = new NotifyThread();
		wd.start();
		nd.start();
		
		//TODO主執行緒等待子執行緒的三種法法
		//呼叫join
		// nd.join();
		// wd.join();
		
		//呼叫CountDownLatch
		lath.await();
		
		//呼叫CyclicBarrier
		// lathb.await();
		System.out.println("=============");

	}
}

相關推薦

Object wait notify notifyAll 方法

wait()方法表示,放棄當前對資源的佔有權,等啊等啊,一直等到有人通知我,我才會執行後面的程式碼。 notify()方法表示,當前的執行緒已經放棄對資源的佔有, 通知等待的執行緒來獲得對資源的佔有權,但是隻有一個執行緒能夠從wait狀態中恢復, 然後繼續執行w

Java Object 對象上的wait(),notify(),notifyAll()方法理解

imp 線程等待 i++ col etl cpu 階段 單例 rac 第一階段理解(2017-7-27): Java 將wait(),notify(),notifyAll()方法放在Object對象上,也就是說任何一個對象都可以調用這個方法,這與”任何一個對象

Java執行緒的等待/通知(wait/notify)機制

Java的等待/通知 機制,舉例來說就是,執行緒A,拿到了物件object的鎖,並且呼叫了object的wait()方法,同時釋放了鎖,然後進入WAITTING狀態。執行緒B同樣前提是拿到了object的鎖,然後呼叫了notify()或notifyAll()方法

waitnotify方法

wait和notify方法 wait方法和notify方法是Object類的方法,用以支援執行緒間通訊。 1、wait方法 以下是wait方法的三個過載方法: public final void wait() throws InterruptedExeception publ

wait,notify,notifyAll,sleep這些方法都跟執行緒的狀態變化有關,為什麼jdk把前三個方法放在Object類裡面,而把sleep放在Thread類裡面?

首先,雖然這些方法都跟執行緒的狀態變化有關,但wait(),notify(),notifyAll()這三個方法在用法上就跟sleep()方法不太一樣,wait(),notify(),notifyAll()必須在sychronized同步程式碼塊中使用,且要用當前執行緒持有的鎖

Java-JUC(九):使用Lock替換synchronized,使用Condition的await,singal,singalall替換objectwait,notify,notifyall實現線程間的通信

可能 AR purchase name ati for rac 需要 條件變量 Condition: condition接口描述了可能會與鎖有關的條件變量。這些用法上與使用object.wait訪問隱式監視器類似,但提供了更強大的功能。需要特別指出的是,單個lock可

Java Object對象中的wait,notify,notifyAll的理解

tee nbsp str 開啟 tor leg 隨機選擇 exception out wait,notify,notifyAll 是定義在Object類的實例方法,用於控制線程狀態,在線程協作時,大家都會用到notify()或者notifyAll()方法,其中wait與no

String.format(String format, Object... args)方法

輸出 控制 8進制 util .get ont 說明文檔 $0 說明符 很多次見到同事使用這個方法,同時看到https://blog.csdn.net/qq_27298687/article/details/68921934這位仁兄寫的非常仔細,我也記錄一下,好加深印象。

Object類所有方法——面試

工作後往往忽略一些基礎知識的複習,而在面試中常常被這些問題弄得抓耳撓腮,明明知道問題簡單卻就是回答不出來,小二在這也是感同身受,最近先整理幾篇基礎知識的博文共以後自己複習; 1.getClass public final Class<?> getC

-1-5 java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖 sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在O

 本文關鍵詞: java 多執行緒 概念 程序 執行緒區別聯絡 java建立執行緒方式 執行緒組 執行緒池概念 執行緒安全 同步 同步程式碼塊 Lock鎖  sleep()和wait()方法的區別 為什麼wait(),notify(),notifyAll()等方法都定義在Object類中 多執行緒

Object類中hashCode()和equals()方法(附圖)

 下圖是規範中要求的: 圖解:比如equals相等的箭頭指向hashcode相等,標示equals相等那麼必有hashcode相等。另外有兩個箭頭指向別人的標示可能是其中之一。 //JAVA程式碼: public static void main

Java執行緒sleep,yield,join,wait方法

1、sleep() 當一個執行緒呼叫sleep方法後,他就會放棄cpu,轉到阻塞佇列,sleep(long millis)方法是Thread類中的靜態方法,millis引數設定執行緒睡眠的時間,毫秒為

wait(),notify(),notifyAll()用來操作執行緒為什麼定義在Object類中?wait(),sleep()區別?

wait(),notify(),notifyAll()用來操作執行緒為什麼定義在Object類中? 這些方法存在於同步中; 使用這些方法必須標識同步所屬的鎖; 鎖可以是任意物件,所以任意物件呼叫方法一定定義在Object類中。 wait(),sleep(

java 為什麼wait(),notify(),notifyAll()必須在同步(Synchronized)方法/程式碼塊中呼叫?

先回答問題: (1)為什麼wait()必須在同步(Synchronized)方法/程式碼塊中呼叫? 答:呼叫wait()就是釋放鎖,釋放鎖的前提是必須要先獲得鎖,先獲得鎖才能釋放鎖。 (2)為什麼notify(),notifyAll()必須在同步(Synchronize

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

void java.lang.Object.notify() Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them

JavaScript Object.defineProperty()方法

Object.defineProperty() Object.defineProperty() 方法直接在一個物件上定義一個新屬性,或者修改一個已經存在的屬性, 並返回這個物件。 語法 Object.defineProperty(obj, pro

【Java面試題】之Object類中方法

之前看到有人分享的面經,面試官先問Object中有什麼方法,然後再要求解釋每一次方法的作用。 先看看Object中有什麼方法 Object類是Java中所有類的基類。位於java.lang包中,一共有13個方法 方法一 Object() 即Object的構造方法 大

轉載 wait(),notify(),notifyAll()用來操作線程為什麽定義在Object類中?

not 調用 存在 await on() 比較 保護 接口 sign 這些方法存在於同步中; 使用這些方法必須標識同步所屬的鎖; 鎖可以是任意對象,所以任意對象調用方法一定定義在Object類中。 Condition是在java 1.5中才出現的,它用來替

Object.keys方法

一、官方解釋 Object.keys() 方法會返回一個由一個給定物件的自身可列舉屬性組成的陣列,陣列中屬性名的排列順序和使用 for...in 迴圈遍歷該物件時返回的順序一致 。如果物件的鍵-值都不可列舉,那麼將返回由鍵組成的陣列。 二、語法 Object.keys(ob

$.ajax()方法

例如 lencod ace 包含 等等 json 返回 用戶名 代碼 jquery中的ajax方法參數總是記不住,這裏記錄一下。 1.url: 要求為String類型的參數,(默認為當前頁地址)發送請求的地址。 2.type: 要求為String類型的參數,請求方式(p