多线程-4.wait() notify() notifyAll() 生产者消费者模型
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0). The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution. As in the one argument version, interrupts and spurious wakeups are possible, and this method should always be used in a loop:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
This method should only be called by a thread that is the owner of this object's monitor. See the notify method for a description of the ways in which a thread can become the owner of a monitor.
- By executing a synchronized instance method of that object.
- By executing the body of a synchronized statement that synchronizes on the object.
- For objects of type Class, by executing a synchronized static method of that class.
/**
* @throws IllegalMonitorStateException if the current thread is not
* the owner of this object's monitor.
* @see java.lang.Object#notifyAll()
* @see java.lang.Object#wait()
*/
public final native void notify();
* @throws IllegalMonitorStateException if the current thread is not
* the owner of this object's monitor.
* @see java.lang.Object#notify()
* @see java.lang.Object#wait()
*/
public final native void notifyAll();
1 public class TestSetAndGet {
2 static class Goods {
3 public String lock = Thread.currentThread().getName()+"test";
4 volatile static int number = 1;
5 private static final int max_size = 10;
6
7 // 生产者增加一个产品
8 public void set() throws InterruptedException {
9 synchronized (this) {
10 while (number >= max_size) {
11 // wait()方法一定要持有锁对象的minitor监视器,所以一定要放在notify之前
12 wait();
13 }
14 if (number == 0) {
15 System.out.print("-同时唤醒所有的消费者和生产者。");
16 notifyAll();
17 }
18 number++;
19 System.out.print("生产者增加一个,当前数量:"+number);
20 System.out.println();
21 }
22 }
23 // 消费者消费一个产品
24 public void get() throws InterruptedException {
25 synchronized (this) {
26 while (number <= 0) {
27 // wait()方法一定要持有锁对象的minitor监视器,所以一定要放在notify之前
28 wait();
29 }
30 if (number == max_size) {
31 System.out.print("唤醒所有的消费者和生产者。");
32 notifyAll();
33 }
34 number--;
35 System.out.print("消费者消费一个,当前数量:"+number);
36 System.out.println();
37 }
38 }
39 }
40
41 public static void main(String[] args) throws InterruptedException {
42 Goods goods = new Goods();
43
44 for (int i = 0; i < 20; i++) {
45 // 生产者慢一点,可以让货物在0-1之间盘桓
46 //Thread.sleep(100);
47 new Thread(()->{
48 try {
49 goods.set();
50 } catch (InterruptedException e) {
51 e.printStackTrace();
52 }
53 }).start();
54 }
55 for (int i = 0; i < 20; i++) {
56 new Thread(()->{
57 try {
58 goods.get();
59 } catch (InterruptedException e) {
60 e.printStackTrace();
61 }
62 }).start();
63 }
64
65 }
66 }
多线程-4.wait() notify() notifyAll() 生产者消费者模型的更多相关文章
- java多线程:线程间通信——生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
- Java多线程(九):生产者消费者模型
生产者消费者模型 生产者:生产任务的个体: 消费者:消费任务的个体: 缓冲区:是生产者和消费者之间的媒介,对生产者和消费者解耦. 当 缓冲区元素为满,生产者无法生产,消费者继续消费: 缓冲区元素为空, ...
- (三)(2)wait/notify实现生产者-消费者模型,join方法
生产者,消费者模型 举个例子来说明,厨师,服务员,厨师做菜,服务员上菜,如果厨师没有做好菜,那么服务员就无法上菜,厨师做好了菜,然后通知服务员消费(上菜).在这个过程之中,厨师扮演的就是生产者,服务员 ...
- Java多线程使用wait和notify实现生产者消费者模型
Java多线程使用wait和notify这两个关键字的学习,通过实现生成者与消费者来成对研究比较科学. 从两个字的意义来讲就是等待与通知这个简单道理. 现在先模拟一个缓存区存储,是用一个list实现的 ...
- Python多线程的简单实现(生产者消费者模型)
__author__ = "JentZhang" import time, threading, queue q = queue.Queue(maxsize=) # 声明队列 de ...
- java多线程15 :wait()和notify() 的生产者/消费者模式
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- Java多线程14:生产者/消费者模型
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- Python多线程-生产者消费者模型
用多线程和队列来实现生产者消费者模型 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threading imp ...
随机推荐
- python基础学习之函数基础和部分内置函数
在函数调用的时候,必备参数必须要传入 函数定义: def 函数名: 代码块pass return 返回值 函数名命名规则: 字母.数字和下划线组成,和变量命名规则一致 pass在这里表示什么都没有 ...
- 谈谈C++中的数据对齐
对于C/C++程序员来说,掌握数据对齐是很有必要的,因为只有了解了这个概念,才能知道编译器在什么时候会偷偷的塞入一些字节(padding)到我们的结构体(struct/class),也唯有这样我们才能 ...
- P1012 拼数(JAVA语言)
//早起刷题傻一天 题目描述 设有nn个正整数(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3n=3时,33个整数1313,312312,343343联接成的最大整数 ...
- 1、Spring教程之Spring概述
1.Spring概述 简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月24 ...
- java位运算求一个整数的绝对值
1 import java.util.Scanner; 2 3 public class Question1 { 4 public static void main(String[] args) { ...
- java例题_35 找到最大值和最小值并交换位置
1 /*35 [程序 35 最大最小交换] 2 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组. 3 */ 4 5 /*分析 6 * 1.先初始化一个数组,然后从键盘获得值 ...
- 生产中常用的du命令
1. 介绍 du是用来查看文件或目录所占用磁盘空间的大小 du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exc ...
- 别再面向 for 循环编程了,Spring 自带的观察者模式就很香!
上一篇:JDK 自带的观察者模式就很香! 前段时间栈长给大家分享了什么是观察者模式,以及在 JDK 中如何实现观察者模式,现在都是 Spring 的天下了,今天就再分享下如何在 Spring/ Spr ...
- SQL语句通过身份证号计算年龄
SQL语句通过身份证号计算年龄 1.截取身份证号上的出生日期 身份证一般为18位数和15位数 18位数身份证的第7-10位数是出生年份,第11-14位数是出生月日,所以18位身份证的年龄计算如下 su ...
- MyBatis-Plus笔记(入门)
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 官方文档 https://mybatis.plus/guide/ 本篇基于springboot,mybatis Plus的版本为3.4.2 本篇对应 ...