文档目录:

一、概念

二、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. 1 package com.bk.java.Test40_ProducerAndCousumer;
  2. 2
  3. 3 import java.util.ArrayList;
  4. 4 import java.util.List;
  5. 5
  6. 6 public class ThreadTest {
  7. 7 public static void main(String[] args) {
  8. 8 //创建仓库对象
  9. 9 List list=new ArrayList();
  10. 10 //创建线程对象:生产者与消费者
  11. 11 Thread t1=new Thread(new Producer(list));
  12. 12 Thread t2=new Thread(new Consumer(list));
  13. 13 t1.setName("生产者");
  14. 14 t2.setName("消费者");
  15. 15 t1.start();
  16. 16 t2.start();
  17. 17 }
  18. 18 }
  19. 19 class Producer implements Runnable{
  20. 20 //创建仓库
  21. 21 private List list;
  22. 22 public Producer(List list)
  23. 23 {
  24. 24 this.list=list;
  25. 25 }
  26. 26 @Override
  27. 27 public void run() {
  28. 28 while (true){
  29. 29 synchronized (list){
  30. 30 if(list.size()>0){
  31. 31 try {
  32. 32 list.wait();
  33. 33 } catch (InterruptedException e) {
  34. 34 e.printStackTrace();
  35. 35 }
  36. 36 }
  37. 37 //仓库为空,永久生产
  38. 38 Object obj=new Object();
  39. 39 list.add(obj);
  40. 40 System.out.println(Thread.currentThread().getName()+"------->"+obj);
  41. 41 //唤醒消费者
  42. 42 list.notify();
  43. 43 }
  44. 44 }
  45. 45
  46. 46 }
  47. 47 }
  48. 48 class Consumer implements Runnable{
  49. 49 //创建仓库
  50. 50 private List list;
  51. 51 public Consumer(List list)
  52. 52 {
  53. 53 this.list=list;
  54. 54 }
  55. 55 @Override
  56. 56 public void run() {
  57. 57 while (true){
  58. 58 synchronized (list){
  59. 59 if(list.size()==0){
  60. 60 //仓库空了
  61. 61 try {
  62. 62 list.wait();
  63. 63 } catch (InterruptedException e) {
  64. 64 e.printStackTrace();
  65. 65 }
  66. 66 }
  67. 67 Object obj=list.remove(0);
  68. 68 System.out.println(Thread.currentThread().getName()+"------->"+obj);
  69. 69 //唤醒生产者
  70. 70 list.notify();
  71. 71 }
  72. 72 }
  73. 73
  74. 74 }
  75. 75 }

查看执行结果-片段:

  1. 消费者------->java.lang.Object@214bb29b
  2. 生产者------->java.lang.Object@17a03a96
  3. 消费者------->java.lang.Object@17a03a96
  4. 生产者------->java.lang.Object@767b0dec
  5. 消费者------->java.lang.Object@767b0dec
  6. 生产者------->java.lang.Object@1d8a042
  7. 消费者------->java.lang.Object@1d8a042
  8. 生产者------->java.lang.Object@7d7b1588
  9. 消费者------->java.lang.Object@7d7b1588
  10. 生产者------->java.lang.Object@6b19e43b

java进阶(40)--wait与notify(生产者与消费者模式)的更多相关文章

  1. java生产者与消费者模式

    前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...

  2. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  3. java 线程并发(生产者、消费者模式)

    线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...

  4. Java多线程设计模式(2)生产者与消费者模式

    1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...

  5. condition版生产者与消费者模式

    1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...

  6. 【爬虫】Condition版的生产者和消费者模式

    Condition版的生产者和消费者模式 threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作 threading.Condi ...

  7. 使用libuv实现生产者和消费者模式

    生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...

  8. 【爬虫】Load版的生产者和消费者模式

    ''' Lock版的生产者和消费者模式 ''' import threading import random import time gMoney = 1000 # 原始金额 gLoad = thre ...

  9. Java中生产者与消费者模式

    生产者消费者模式 首先来了解什么是生产者消费者模式.该模式也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...

随机推荐

  1. ES6 进制字面量 All In One

    ES6 进制字面量 All In One 二进制 & 八进制 & 字面量 https://developer.mozilla.org/en-US/docs/Web/JavaScript ...

  2. nodejs 简单的模拟代理服务器

    https://nodejs.org/api/net.html#net_net_createconnection 代理前:client -> server 代理后:client -> pr ...

  3. 我眼中的价值币——NGK(下)

    跨链交互方案并不是区块链世界中的一个新课题.自比特币诞生揭开智能合约的序幕之后,跨链交互的需求便产生了.但是,经过十年的发展,市场中的跨链解决方案进展缓慢,究之原因有以下几个方面. 首先,区块链的去中 ...

  4. AttributeError: 'function' object has no attribute 'as_view'

    我的描述:当我启用jwt_required来进行token验证的时候,我提示错误; 解决方案: 修改前代码: 修改后代码: 多看书.多多了解.多看看世界...

  5. 1063 Set Similarity——PAT甲级

    1063 Set Similarity Given two sets of integers, the similarity of the sets is defined to be Nc/Nt*10 ...

  6. Jquery获取链接请求的参数

    比如有一个链接:https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000,先定义方法: //获取url中的参数 function ge ...

  7. Django3.0 + nginx + uwsgi 部署

    CentOS7.6 下部署Django3.0应用,使用nginx+uwsgi部署: 1. uwsgi部署 pip install uwsgi 在项目的根目录中,新建文件夹 conf, 然后进入conf ...

  8. Flask:基本结构

    在大多数标准中,Flask 都算是小型框架,小到可以称为"微框架".但是,小并不意味着它比其他框架的功能少.Flask 自开发伊始就被设计为可扩展的框架,它具有一个包含基本服务的强 ...

  9. 31Si2CrMoB

    转: 31Si2CrMoB 31Si2CrMoB是推土机用钢的一种耐磨钢:此钢有很高的强度和韧度,适合于推土机XX.31Si2CrMoB冶炼技术工艺:电弧炉冶炼,初轧开坯.钢板轧制:可√189-170 ...

  10. 剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出

    剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Coll ...