经典生存者消费者模型,wait,notify和notifyAll实现

2023-05-16

经典生存者消费者模型,使用Object的wait,notify和notifyAll实现

 

Java Object的wait,notify和notifyAll方法

        调用wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。

        调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

        调用notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

 

/**************************************************************************************** 
 Copyright © 2014 Your Company/Org. All rights reserved.<br> 
 Reproduction or transmission in whole or in part, in any form or<br>
 by any means, electronic, mechanical or otherwise, is prohibited<br>
 without the prior written consent of the copyright owner. <br>
 ****************************************************************************************/
package com.beston.concurrency.synchronization;

/** 
 * @ClassName: WaitNotify 
 * @Description: 经典生存者消费者模型,使用Object的wait,notify和notifyAll实现
 * @author beston 
 * @date 2014年3月28日 上午10:11:10 
 * @version v1.0
 *  
 */
public class WaitNotify {
	public static void main(String[] a){
		Target t = new Target();
		ProduceThread p = new ProduceThread(t);
		ConsumeThread c = new ConsumeThread(t);
		Thread t1 = new Thread(p,"生产线程1");
		Thread t2 = new Thread(p,"生产线程2");
		Thread t3 = new Thread(c,"消费线程1");
		Thread t4 = new Thread(c,"消费线程2");
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
	
}

class Target{
	public int i = 0;
	
	public synchronized void produce(){
		if(i == 4){
			try {
				System.out.println(Thread.currentThread().getName()+":生产满了,等待消费操作");
				this.wait();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			i++;
			this.notifyAll();
		}
		System.out.println(Thread.currentThread().getName()+":"+i);
		
	}
	
	public synchronized void consume(){
		if(i == 0){
			try {
				System.out.println(Thread.currentThread().getName()+":消费完了,等待生产操作");
				this.wait();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			i--;
			this.notifyAll();
		}
		System.out.println(Thread.currentThread().getName()+":"+i);
		this.notifyAll();
	}
}

class ProduceThread implements Runnable{
	private Target t;
	public ProduceThread(Target t){
		this.t = t;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		for(int i=0;i<20;i++){
			t.produce();
			try {
				Thread.sleep((long) (Math.random()*50));
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

class ConsumeThread implements Runnable{
	private Target t;
	public ConsumeThread(Target t){
		this.t = t;
	}

	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		for(int i=0;i<20;i++){
			t.consume();
			try {
				Thread.sleep((long) (Math.random()*50));
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 结果:

生产线程1:1

消费线程1:0

生产线程2:1

消费线程2:0

生产线程2:1

消费线程2:0

消费线程1:消费完了,等待生产操作

生产线程2:1

消费线程1:1

生产线程1:2

生产线程1:3

生产线程1:4

消费线程2:3

生产线程1:4

生产线程2:生产满了,等待消费操作

消费线程2:3

生产线程2:3

消费线程1:2

生产线程2:3

消费线程2:2

消费线程2:1

消费线程1:0

生产线程1:1

消费线程1:0

生产线程2:1

消费线程1:0

消费线程2:消费完了,等待生产操作

生产线程2:1

生产线程1:2

消费线程1:1

消费线程2:1

生产线程2:2

消费线程2:1

消费线程1:0

生产线程1:1

生产线程1:2

生产线程2:3

消费线程1:2

消费线程2:1

消费线程1:0

生产线程1:1

生产线程1:2

消费线程1:1

生产线程2:2

消费线程2:1

消费线程1:0

消费线程2:消费完了,等待生产操作

生产线程1:1

消费线程2:1

生产线程2:2

消费线程2:1

生产线程1:2

生产线程1:3

生产线程1:4

消费线程1:3

消费线程1:2

生产线程2:3

消费线程2:2

生产线程1:3

消费线程1:2

生产线程1:3

生产线程2:4

消费线程2:3

生产线程1:4

消费线程1:3

生产线程1:4

生产线程2:生产满了,等待消费操作

生产线程1:生产满了,等待消费操作

消费线程2:3

生产线程1:3

生产线程2:3

生产线程2:4

生产线程2:生产满了,等待消费操作

消费线程1:3

生产线程2:3

消费线程2:2

消费线程1:1

消费线程2:0

生产线程2:1

消费线程1:0

消费线程2:消费完了,等待生产操作

消费线程1:消费完了,等待生产操作

生产线程2:1

消费线程1:1

消费线程2:1

生产线程2:2

消费线程2:1

生产线程2:2

消费线程2:1

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

经典生存者消费者模型,wait,notify和notifyAll实现 的相关文章

  • Windows下seata报错为can not register RM,err:can not connect to services-server的解决办法,亲测有效。

    nacoc下的服务 xff1a 点开seata的TC服务看一下里面的地址 xff0c 左下角为你该服务的ip地址 上图我的ip地址是我目前在用的校园网地址也就是你的桌面右下角的网络地址 我之前报错的原因呢是因为他这里的默认的ip是我之前虚拟
  • JS提取字符串的手机号或固话

    JS提取字符串的手机号或固话 座机 let str 61 39 座机号1 0451 1234567 座机号2 010 12345678 座机号3 4008208201 电话 17365040083转1号线 39 0451 010是地区区号
  • Arrays类及该类中的方法[java]

    基本概念 概述 xff1a 用于操作数组的工具类 xff0c 里面定义了常见操作数组的静态方法 1 Arrays类中的方法都是静态方法 xff0c 都是通过类名调用 2 都是静态方法 xff0c 也就是说明了Arrays中的方法没有一个是重
  • 2021版kali linux中文化教程

    kali的中文化 xff0c 一开始配置需要下载中科大的源 xff0c 打开 终端输入vim etc apt sources list xff0c 将内容变成如下 deb http mirrors ustc edu cn kali kali
  • windows向ubuntu虚拟机传输文件

    更新源 xff0c 更新过了就不用了 sudo apt get update 安装依赖项 sudo apt get install open vm 粘贴文件需要粘贴两次 xff08 我是用拖的 xff09 xff0c 第一次ubuntu会创
  • 从零开始的Spring6学习(一)

    新手上路 xff0c 诸多不足与错误 xff0c 请优雅指正 xff0c 轻喷 Spring6是一个里程碑的Spring框架 首先要明白为什么要出现框架 xff1a 在程序的开发中 xff0c 一直追求高内聚 xff0c 低耦合 xff0c
  • KindEditor中使用val()获取content内容后图片不显示

    场景 使用KindEditor进行图片上传后 xff0c 在js部分通过 val 获取内容后 xff0c 所获取的图片的 lt imgsrc 61 34 34 其中img标签与src连接在了一起导致图片不能显示 错误的数据库存取内容 xff
  • 微信登录显示连接失败,请检查网络

    背景 xff1a 最近公司网络不知道怎么回事 xff0c 显示连接失败 xff0c 请检查网络 最初解决方案 重新插拔网线 xff0c 就可以登陆微信了 xff0c 但是退出重登需要继续插拔网线 同事分享的解决方案 xff1a 1 右键以太
  • Property or method “XXX“ is not defined on the instance but referenced during render.解决方法

    在做Vue项目时 xff0c 有时候会看到这个警告 这里是因为vue检测到了 count 这个属性有被使用 xff0c 但是未定义 xff0c 页面虽然能够显示但是有红色信息总归是不好看的 xff0c 解决方法如下 xff1a 我们只需要在
  • 如何用Idea 创建Spring项目

    如何用IntelliJ Idea创建一个简单的Spring项目呢 xff0c 刚入门的人可能不太懂 xff0c 那我就来简单分享一下吧 第一步 点击新建一个maven项目 xff0c 点击下一步 xff08 不用选择从原型创建 xff09
  • OpenCV初尝试13——图像特征

    13 图像特征 13 1 Harris角点检测 Harris角点检测的思想是通过图像的局部的小窗口观察图像 xff0c 角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化 Harris角点检测的数学原理较为繁琐 xff0c 直接上个链
  • 华为secoclient客户端安装

    下载安装包 xff0c 右键以管理员身份运行 2 安装过程中一律选择同意 是 xff0c 完成后打开软件 点击标注处 3 输入网关地址和端口号 xff0c 选择添加 4 添加完成后确定并点击连接 xff0c 输入用户名 密码 xff0c 记
  • maven配置连接MySQL数据库

    2019年7月9号 问题 xff1a maven项目中连接不上mysql数据库 问题 xff1a maven项目中连接不上mysql数据库 从昨晚调bug一直调到今天上午 xff0c 昨晚发现了是maven项目中mysql数据库连接的问题
  • python学习:最适合初学者的8本Python书籍

    Python是最友好的编程语言之一 xff0c 也因此成为初学者的首选 xff0c 为了帮助你更好更快的上手Python xff0c 并学会使用Python进行编程 xff0c 本文我们为初学者分享了最好的Python书籍 希望能够对你有所
  • 最适合Python入门到大牛必看的7本书籍,一定要收藏!

    Python零基础应该阅读哪些书籍 xff1f 我推荐这三本书 1 Python学习手册 xff08 第4版 xff09 以计算机科学家一样的思维方式来理解Python语言编程 xff0c 实用的学习指南 xff0c 适合没有Python编
  • 前端开发:深入使用proxy代理解决前端跨域问题

    在前端领域里面 xff0c 跨域指的是浏览器允许向服务器发送跨域请求 xff0c 进而克服Ajax只能同源使用的局限性限制 同源策略是一种约定 xff0c 而且是浏览器中最基本也是最核心的安全功能 xff0c 若缺少了该策略 xff0c 浏
  • 手工搭建Servlet实现

    现在作为一个Java程序员 xff0c 我们已经习惯了使用IDE和Web框架进行开发 xff0c IDE帮助我们做了编译 打包的工作 Spring框架则帮助我们实现了Servlet接口 xff0c 并把Servlet容器注册到了Web容器中
  • airflow 文档学习(二) - 概念

    1 核心功能 1 1 DAGs 有向无环图 反映所涉及的task的依赖关系 注 xff1a 搜索dag的时候 xff0c airflow只会关注同事包含 34 DAG 34 和 34 airflow 34 字样的py文件 1 2 scope
  • java使用枚举进行前后端交互,以列表方式返回前端

    在有些情况下 xff0c 有一些下拉选择器的数据项 xff0c 我们采取了枚举的方式返回前端一个列表 xff0c 但是里面的东西多 xff0c 前端不想写死 xff0c 需要提供接口返回 xff0c 如下图类似这种 第一步 xff1a 先创
  • python循环,16段代码入门Python循环语句,值得收藏!

    导读 本文重点讲述for语句和while语句 for语句属于遍历循环 xff0c while语句属于当型循环 除了两个循环语句外 xff0c 还介绍了break continue与pass三个用于控制循环结构中的程序流向的语句 在此基础之上

随机推荐