java进阶(40)--wait与notify(生产者与消费者模式)
文档目录:
一、概念
二、wait的作用
三、notify的作用
四、生产者消费者模式
五、举例
---------------------------------------分割线:正文--------------------------------------------------------
一、概念
1、wait与notify为Object类自带,可用户任意的对象
2、wait的作用
o.wait()表示让正在o对象上的活动线程进入等待状态,无期限等待,直到被唤醒为止,释放o线程的锁
3、notify的作用
o.notify()表示让o对象上等待的线程唤醒,只通知,不释放对象的锁
二、生产者消费者模式
1、含义:
一个线程负责生产,一个线程负责消费,为达到生产与消费均衡
2、注意事项:
仓库是多线程共享的,仓库的对象最终调用wait与notify方法,建立在synchronized线程同步机制的基础上
三、举例:使用wait与notify方法实现生产者与消费者模式
- 1 package com.bk.java.Test40_ProducerAndCousumer;
- 2
- 3 import java.util.ArrayList;
- 4 import java.util.List;
- 5
- 6 public class ThreadTest {
- 7 public static void main(String[] args) {
- 8 //创建仓库对象
- 9 List list=new ArrayList();
- 10 //创建线程对象:生产者与消费者
- 11 Thread t1=new Thread(new Producer(list));
- 12 Thread t2=new Thread(new Consumer(list));
- 13 t1.setName("生产者");
- 14 t2.setName("消费者");
- 15 t1.start();
- 16 t2.start();
- 17 }
- 18 }
- 19 class Producer implements Runnable{
- 20 //创建仓库
- 21 private List list;
- 22 public Producer(List list)
- 23 {
- 24 this.list=list;
- 25 }
- 26 @Override
- 27 public void run() {
- 28 while (true){
- 29 synchronized (list){
- 30 if(list.size()>0){
- 31 try {
- 32 list.wait();
- 33 } catch (InterruptedException e) {
- 34 e.printStackTrace();
- 35 }
- 36 }
- 37 //仓库为空,永久生产
- 38 Object obj=new Object();
- 39 list.add(obj);
- 40 System.out.println(Thread.currentThread().getName()+"------->"+obj);
- 41 //唤醒消费者
- 42 list.notify();
- 43 }
- 44 }
- 45
- 46 }
- 47 }
- 48 class Consumer implements Runnable{
- 49 //创建仓库
- 50 private List list;
- 51 public Consumer(List list)
- 52 {
- 53 this.list=list;
- 54 }
- 55 @Override
- 56 public void run() {
- 57 while (true){
- 58 synchronized (list){
- 59 if(list.size()==0){
- 60 //仓库空了
- 61 try {
- 62 list.wait();
- 63 } catch (InterruptedException e) {
- 64 e.printStackTrace();
- 65 }
- 66 }
- 67 Object obj=list.remove(0);
- 68 System.out.println(Thread.currentThread().getName()+"------->"+obj);
- 69 //唤醒生产者
- 70 list.notify();
- 71 }
- 72 }
- 73
- 74 }
- 75 }
查看执行结果-片段:
- 消费者------->java.lang.Object@214bb29b
- 生产者------->java.lang.Object@17a03a96
- 消费者------->java.lang.Object@17a03a96
- 生产者------->java.lang.Object@767b0dec
- 消费者------->java.lang.Object@767b0dec
- 生产者------->java.lang.Object@1d8a042
- 消费者------->java.lang.Object@1d8a042
- 生产者------->java.lang.Object@7d7b1588
- 消费者------->java.lang.Object@7d7b1588
- 生产者------->java.lang.Object@6b19e43b
java进阶(40)--wait与notify(生产者与消费者模式)的更多相关文章
- java生产者与消费者模式
前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...
- Java并发编程(4)--生产者与消费者模式介绍
一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...
- java 线程并发(生产者、消费者模式)
线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...
- Java多线程设计模式(2)生产者与消费者模式
1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...
- condition版生产者与消费者模式
1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...
- 【爬虫】Condition版的生产者和消费者模式
Condition版的生产者和消费者模式 threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作 threading.Condi ...
- 使用libuv实现生产者和消费者模式
生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...
- 【爬虫】Load版的生产者和消费者模式
''' Lock版的生产者和消费者模式 ''' import threading import random import time gMoney = 1000 # 原始金额 gLoad = thre ...
- Java中生产者与消费者模式
生产者消费者模式 首先来了解什么是生产者消费者模式.该模式也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...
随机推荐
- ES6 进制字面量 All In One
ES6 进制字面量 All In One 二进制 & 八进制 & 字面量 https://developer.mozilla.org/en-US/docs/Web/JavaScript ...
- nodejs 简单的模拟代理服务器
https://nodejs.org/api/net.html#net_net_createconnection 代理前:client -> server 代理后:client -> pr ...
- 我眼中的价值币——NGK(下)
跨链交互方案并不是区块链世界中的一个新课题.自比特币诞生揭开智能合约的序幕之后,跨链交互的需求便产生了.但是,经过十年的发展,市场中的跨链解决方案进展缓慢,究之原因有以下几个方面. 首先,区块链的去中 ...
- AttributeError: 'function' object has no attribute 'as_view'
我的描述:当我启用jwt_required来进行token验证的时候,我提示错误; 解决方案: 修改前代码: 修改后代码: 多看书.多多了解.多看看世界...
- 1063 Set Similarity——PAT甲级
1063 Set Similarity Given two sets of integers, the similarity of the sets is defined to be Nc/Nt*10 ...
- Jquery获取链接请求的参数
比如有一个链接:https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000,先定义方法: //获取url中的参数 function ge ...
- Django3.0 + nginx + uwsgi 部署
CentOS7.6 下部署Django3.0应用,使用nginx+uwsgi部署: 1. uwsgi部署 pip install uwsgi 在项目的根目录中,新建文件夹 conf, 然后进入conf ...
- Flask:基本结构
在大多数标准中,Flask 都算是小型框架,小到可以称为"微框架".但是,小并不意味着它比其他框架的功能少.Flask 自开发伊始就被设计为可扩展的框架,它具有一个包含基本服务的强 ...
- 31Si2CrMoB
转: 31Si2CrMoB 31Si2CrMoB是推土机用钢的一种耐磨钢:此钢有很高的强度和韧度,适合于推土机XX.31Si2CrMoB冶炼技术工艺:电弧炉冶炼,初轧开坯.钢板轧制:可√189-170 ...
- 剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出
剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Coll ...