1. 程式人生 > >執行緒等待通知機制

執行緒等待通知機制

等待通知機制,是指一個執行緒A呼叫了物件O的wait方法進入等待狀態,而另一個執行緒呼叫了物件O的notify或者notifyAll方法,執行緒A收到通知後從物件O的wait方法返回,進而執行後續操作

方法名稱 描述
notify() 通知一個在物件上對待的執行緒,使其從wait方法返回,而返回的前提是該執行緒獲取到了物件的鎖
notifyAll() 通知所有等待在該物件上的執行緒
wait() 呼叫該方法的執行緒進入WAITING狀態,只有等待另一個執行緒的通知或中斷才會被返回,需要注意,呼叫wait方法後,會釋放物件鎖
wait(long) 超時等待一段時間,這裡引數時間是毫秒,如果沒有通知就超時返回
wait(long,int) 對於超時時間更細粒度的控制,可以達到納秒

程式碼示例

package com.demo.demo4;

import java.text.SimpleDateFormat;
import java.util.Date;

public class WaitNotify {

	static boolean flag = true;

	static Object lock = new Object();

	public static void main(String[] args) {

		Thread waitThread = new Thread(new Wait(),"waitThread");
		waitThread.start();
		try {
			Thread.sleep(1);
			Thread notifyThread = new Thread(new Notify(),"notifyThread");
			notifyThread.start();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	static class Wait implements Runnable{

		@Override
		public void run() {
			//加鎖,擁有lock的Monitor
			synchronized(lock) {
				//當條件不滿足,繼續wait,同時釋放了lock的鎖
				while(flag) {
					try {
						System.out.println(Thread.currentThread()+"flag is 
[email protected]
"+new SimpleDateFormat("HH:mm:ss").format(new Date())); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //滿足條件,完成工作 System.out.println(Thread.currentThread()+"flag is [email protected]"+new SimpleDateFormat("HH:mm:ss").format(new Date())); } } } static class Notify implements Runnable{ @Override public void run() { //加鎖,擁有lock的Monitor synchronized (lock) { //獲取lock的鎖,然後進行通知,通知不會釋放lock的鎖 //直到獲取當前執行緒釋放lock後,WaitThread才能從wait方法返回 System.out.println(Thread.currentThread()+"hold lock.nofity @"+new SimpleDateFormat("HH:mm:ss").format(new Date())); lock.notifyAll(); flag = true; try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } } //在此加鎖 synchronized(lock) { System.out.println(Thread.currentThread()+"hold lock.nofity @"+new SimpleDateFormat("HH:mm:ss").format(new Date())); try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } } } } }

一個執行緒修改了一個物件的值,而另一個執行緒感知到了變化,然後進行相應的操作,整個過程開始於一個執行緒,而最終執行的又是另一個執行緒

1、使用wait(),notify()和notifyAll()時需要先呼叫物件的鎖

2、呼叫wait方法後,執行緒狀態由RUNING變為WAITING,並將當前執行緒放置到物件的等待佇列

3、notify()和notifyAll()方法呼叫後,等待執行緒依舊不會從wait返回,需要呼叫notify()和notifyAll()執行緒釋放鎖之後,等待執行緒才有機會從wait()返回

4、notify()方法將等待佇列中的一個執行緒從等待佇列中移動到同步佇列中,而notifyAll()方法則是將等待佇列中所有的執行緒全部移到同步佇列中,被移動的佇列執行緒狀態由WAITING變為BLOCKED

5、從wait()方法返回的前提就是獲取了呼叫的物件的鎖

相關推薦

15-執行等待通知機制總結

執行緒等待通知機制總結 概述 一個執行緒的等待阻塞狀態,受另外一個執行緒控制。   Object.wait() Object.notify() 特點 必須基於特定的物件鎖synchr

java執行等待/通知機制及中斷

一、等待/通知機制  線上程互動中經常需要對其進行一些控制,希望人為地能夠讓執行緒按理想路線發展,在滿足某條件時進行執行操作而發生變化時,停止等待。 1、 使用sleep  在 if ( ) { } else { }  中使用sleep 對執行緒進行停止等待一段時間。  

執行等待通知機制

等待通知機制,是指一個執行緒A呼叫了物件O的wait方法進入等待狀態,而另一個執行緒呼叫了物件O的notify或者notifyAll方法,執行緒A收到通知後從物件O的wait方法返回,進而執行後續操作 方法名稱 描述 notify() 通知一個在物件上對待的

執行等待喚醒機制

示例程式碼取自傳智播客畢向東老師25天Java基礎教程,添加了一些觀測列印程式碼,便於理解分析。對於程序分析理解純粹個人理解,剛學Java沒多久,難免有錯,僅供參考,如果大神們發現錯誤,希望能幫忙指出,也幫我走出錯誤的理解。 先貼程式碼 class Res{ String name; Str

執行等待喚醒機制:從wait()和sleep()的差別說起

1. wait():釋放資源,釋放鎖 sleep():釋放資源,不釋放鎖 wait():Object的方法,用在同步當中,是同步鎖的方法,以鎖控制執行緒 sleep():執行緒類Thread本身的靜態方法wait(),notify(),notifyAll()方法是用在同步當

執行——等待-喚醒機制

package com.work.wor01; /** * 等待喚醒機制 * 涉及到了3個方法: * 1.wait():等待,將正在執行的執行緒釋放了其執行資格和執行權利,並且將他儲存到執行緒池當中。 * (執行緒池:運行當中會出現很多正在被凍結的執行緒,都會儲存到

Java多執行之三volatile與等待通知機制示例

原子性,可見性與有序性 在多執行緒中,執行緒同步的時候一般需要考慮原子性,可見性與有序性 原子性 原子性定義:一個操作或者多個操作在執行過程中要麼全部執行完成,要麼全部都不執行,不存在執行一部分的情況。 以我們在Java程式碼中經常用到的自增操作i++為例,i++實際上並不是一步操作,而是首先對i的值加一,然

java執行之間的通訊(等待/通知機制)

執行緒開始執行,擁有自己的棧空間,就如同一個指令碼一樣,按照程式碼一步步的執行直到終止。但是,每個執行中的執行緒,如果僅僅是孤立地執行,那麼沒有太大的價值,但如果多個執行緒能夠相互配合完成工作,這將會帶來巨大的價值。 而java多執行緒的等待和通知機制就是用來

JAVA多執行-執行間通訊(一)-等待/通知機制(wait/notify)

執行緒間通訊     執行緒與執行緒之間不是獨立的個體,它們彼此之間可以相互通訊與協作。     執行緒間通訊後,系統之間的互動性會更強大,在大大提交CPU利用率的同時,還會使程式要對各執行緒任務在處

《多執行程式設計》學習之七:等待/通知機制(一)

         今天起開始學習執行緒之間的通訊。等待/通知機制是通過Object類的wait()與notify()方法來實現的,這兩個方法在同步方法或同步程式碼塊中才能被執行。wait()方法將當前執行緒放入“等待執行佇列”中,使執行緒在wait()方法所處程式碼處停止執

《多執行程式設計》學習之七:等待/通知機制(二)

1、生產者與消費者問題           利用等待/通知機制,實現一生產與一消費:操作棧。生產者向棧中生產資料,消費者從棧中消費資料,棧的最大容量為1。           可見容器的size不會大於1,生產與消費這兩個過程交替進行。 2、通過管道進行執行緒之間的

java多執行等待/通知機制

一個執行緒做了修改物件值(或其他)操作,另一個執行緒感知到了變化,然後進行相應操作,整個過程開始於一個執行緒,最終執行又是另外一個執行緒。前者是生產者,後者是消費者,這種模式隔離了“做什麼”和“怎麼做”,實現了業務上的解耦。 其具體實現方式是執行緒A呼叫了物件O的wait(

Java併發程式設計(04):執行間通訊,等待/通知機制

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent) # 一、概念簡介 ## 1、執行緒通訊

Java 執行間通訊 —— 等待 / 通知機制

> 本文部分摘自《Java 併發程式設計的藝術》 ## volatile 和 synchronize 關鍵字 每個處於執行狀態的執行緒,如果僅僅是孤立地執行,那麼它產生的作用很小,如果多個執行緒能夠相互配合完成工作,則將帶來更大的價值 Java 支援多個執行緒同時訪問一個物件或者物件的成員變數,

執行等待通知機制

[TOC] ## 什麼是等待通知機制 在單執行緒中,要執行的操作需要滿足一定條件才能執行,可以把這個操作放在if語句塊中。 在多執行緒程式設計中,可能A執行緒的條件沒有滿足只是暫時的,稍後其他的執行緒B可能會更新條件使得A執行緒的條件得以滿足,可以將A執行緒暫停,直到它的條件得到滿足之後再將A執行緒

java執行學習(四):執行等待wait()和通知notify()的詳細使用

執行緒等待wait()和通知notify(),主要用於多執行緒之間的協作,而且這兩個方法都是屬於Object類,說明任何物件都可以呼叫這兩個方法。 當在一個物件例項上呼叫wait()方法後,當前執行緒就會在這個物件上等待。直到另外的執行緒呼叫了notify()方法,出於等待的執行緒才得以

java 多執行等待、喚醒機制例項

例子: 1、實體類 public class Student {     String name;     int age;     boolean flag = false; // 表示沒有值 } 2、執行緒1 public class SetThread impleme

java 多執行等待與喚醒機制

java 併發程式設計網站 :http://ifeve.com/java-7-concurrency-cookbook/ 一: 1:JVM執行緒狀態 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED

基於事件通知執行等待(vb.net)

在這個帖子中提及了執行緒等待的問題,原方法是用迴圈判斷執行緒狀態來決定是否繼續執行的思路。這種方法的主要問題是浪費資源,雖然用Sleep可以減少cpu的佔用量,但遠不如用事件通知的方法來的優雅。 下面貼出基於事件通知的執行緒等待的程式碼,完全可以舉一反三。 (魏滔序原創,轉帖

java中的互斥鎖,訊號量和多執行等待機制

互斥鎖和訊號量都是作業系統中為併發程式設計設計基本概念,互斥鎖和訊號量的概念上的不同在於,對於同一個資源,互斥鎖只有0和1 的概念,而訊號量不止於此。也就是說,訊號量可以使資源同時被多個執行緒訪問,而互斥鎖同時只能被一個執行緒訪問 互斥鎖在java中的實現就是 Reetr