1. 程式人生 > >執行緒的等待喚醒機制

執行緒的等待喚醒機制

/**
 * 要實現的效果就是,有一個水池,水池的容量為50L,一個放水執行緒,負責放水,每200毫秒放出1L水,當水放完後,通知注水執行緒工作,同時放水執行緒停止工作;
 * 注水執行緒每200毫秒注水1L,水注滿時,再通知放水執行緒繼續工作,同時注水執行緒停止工作.
 * 
 * @author mChenys
 * 
 */
public class _Main5 {
	public static void main(String[] args) {
		Pool pool = new Pool();
		WaterIn in = new WaterIn(pool, "注水執行緒");
		WaterOut out = new WaterOut(pool, "放水執行緒");
		in.start();
		out.start();
	}
}

/**
 * 水池,容量為50L
 * 
 * @author mChenys
 * 
 */
class Pool {
	public int MAX_VLAUE = 50;
	public int curr_value = 0;
}

/**
 * 注水執行緒
 * 
 * @author mChenys
 * 
 */
class WaterIn extends Thread {
	private Pool pool;

	public WaterIn(Pool pool, String name) {
		super(name);
		this.pool = pool;
	}

	@Override
	public void run() {
		while (true) {
			synchronized (pool) {
				try {
					if (pool.curr_value < pool.MAX_VLAUE) {
						// 加水
						Thread.sleep(200);
						pool.curr_value += 1;
						System.out.println(this.getName() + "正在加水,加入 "
								+ pool.curr_value + " L水");
					} else if (pool.curr_value == pool.MAX_VLAUE) {

						System.out.println(this.getName()
								+ "水已加滿!!,可以放水了......");
						pool.notify();// 喚醒放水執行緒
						pool.wait();// 當前執行緒等待,釋放鎖物件
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

/**
 * 放水執行緒
 * 
 * @author mChenys
 * 
 */
class WaterOut extends Thread {
	private Pool pool;

	public WaterOut(Pool pool, String name) {
		super(name);
		this.pool = pool;
	}

	@Override
	public void run() {
		while (true) {
			synchronized (pool) {
				try {
					if (pool.curr_value > 0) {
						// 放水
						Thread.sleep(200);
						pool.curr_value -= 1;
						System.out.println(this.getName() + "開始放水,放出 "
								+ (pool.MAX_VLAUE - pool.curr_value) + " L水");

					} else if (pool.curr_value == 0) {
						System.out.println(this.getName() + "水已放完,可以加水了.....");
						pool.notify();// 喚醒注水執行緒
						pool.wait();// 當前執行緒等待,釋放鎖物件
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
執行效果:

相關推薦

執行等待喚醒機制

示例程式碼取自傳智播客畢向東老師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():等待,將正在執行的執行緒釋放了其執行資格和執行權利,並且將他儲存到執行緒池當中。 * (執行緒池:運行當中會出現很多正在被凍結的執行緒,都會儲存到

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

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

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

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

執行等待通知機制

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

34-多執行--死鎖+執行間通訊+等待喚醒機制+多生產者多消費者問題

一、死鎖 1、死鎖的常見情形之一:同步的巢狀 說明:同步的巢狀,至少得有兩個鎖,且第一個鎖中有第二個鎖,第二個鎖中有第一個鎖。eg:同步程式碼塊中有同步函式,同步函式中有同步程式碼塊。下面的例子,同步程式碼塊的鎖是obj,同步函式的鎖是this。t1執行緒先執行同步程式碼塊,獲取鎖obj,需

執行等待喚醒機制之消費者和生產者模式

/** * 等待喚醒之生產者和消費者模型 * 生成者: 建立和新增資料的執行緒 * 消費者: 銷燬和刪除資料的執行緒 * 問題1: 生成者生成資料過快, 消費者消費資料相對慢,不接收資料了, 會造成資料丟失 * 問題2: 消費者消費資料過快, 生成者生成資料相對慢,不傳送資料了, 會造成資料被重複讀取

python中多執行中event的使用-----------------即一個靈活的方法標誌位,類似於java的等待喚醒機制(python與java不同的地方)

event是python中一個特有的標誌位方法,他一共有三種方法 1.event.wait():如果標誌位設定了,它不做任何事,如果沒有設定,則將會鎖住,等待標誌位的設定 2.event.set():設定標誌位 3.event.clear():清除標誌位 這一種機制很

python中多執行開啟的兩種方式(內含有event的應用,即安全的機制,類似於java的等待喚醒機制,不會出現多個執行之間的錯亂問題)

 event是類似於java中的等待喚醒機制,具體方法參照上一篇CSDN 下面來介紹開啟執行緒的第一種方式 #Filename:threading1.py #開啟執行緒的第一種方式 import threading import time event=threadin

java多執行等待喚醒機制(wait-notify)

wait()、notify()、notifyAll()方法 Object類裡面提供了這幾個方法: wait():讓當前執行緒處於等待(阻塞狀態),直到其他執行緒呼叫此物件的notify()或noti

Java SE多執行部分--20.等待喚醒機制

1、概述 等待喚醒機制就是用於解決執行緒間通訊的問題、常見的方法如下: 1. wait:執行緒不再活動,不再參與排程,進入 wait set 中,因此不會浪費 CPU 資源,也不會去競爭鎖了, 這時的執行緒狀態即是 WAITING。它還要執行一個特別的動作,也即是“通知(

執行之Java中的等待喚醒機制

  多執行緒的問題中的經典問題是生產者和消費者的問題,就是如何讓執行緒有序的進行執行,獲取CPU執行時間片的過程是隨機的,如何能夠讓執行緒有序的進行,Java中提供了等待喚醒機制很好的解決了這個問題!   生產者消費者經典的執行緒中的問題其實是解決執行緒中的通訊問題,就是不同種類的執行緒針對同一資源的操作,

Java多執行生產者與消費者等待喚醒機制(示例)

在下面新建的兩條執行緒,兩條執行緒操作的物件都是學生類,一條執行緒生產學生物件的資料,一條執行緒消費學生物件的資料,且做到,有資料才消費,沒資料就等待,沒資料就生產,有資料就等待。 第一個案例是學生類物件,非常的簡單就定義了兩個成員變數,以及一個用於喚醒執行緒的標記。 成員變數預設會賦值

Java第十四天學習筆記~多執行執行直接通訊---等待喚醒機制、多生產者多消費者問題、JDK1.5新特性、wait和sleep區別)

執行緒直接通訊示例 //資源 class Resource { String name; String sex; } //輸入 class Input implements Runnable { Resource r; Input(Resource r) { this.r=r;

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

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

Java多執行知識點總結——進階篇(八) 之 等待喚醒機制 Lock 鎖升級版

JDK1.5 中提供了多執行緒升級解決方案。 將同步 Synchronized 替換成現實 Lock 操作。 將Object中的 wait、notify、notifyAll,替換成了C

執行間的等待喚醒機制-(一)

執行緒間的同步 等待喚醒機制 執行緒的wait()方法使用就是放棄了執行資格 等待的執行緒都存線上程池當中。 方法:只能在現場同步當中使用。下面的方法必須強調監視器 wait();// 可以是當前執行緒進行等待 notify();// 喚醒

執行之間的通訊(wait()/notify()機制)——等待喚醒機制

wait() : 使當前同步監視器上的執行緒進入等待狀態, 同時釋放鎖     物件名.wait()notify() / notifyAll() : 喚醒當前同步監視器上等待狀態的一個(所有)執行緒    物件名.notify()-------------------- 上述

執行等待喚醒機制

/** * 要實現的效果就是,有一個水池,水池的容量為50L,一個放水執行緒,負責放水,每200毫秒放出1L水,當水放完後,通知注水執行緒工作,同時放水執行緒停止工作; * 注水執行緒每200毫秒注水1L,水注滿時,再通知放水執行緒繼續工作,同時注水執行緒停止工作. * * @author mChe