文档目录:

一、概念

二、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(生产者与消费者模式)的更多相关文章

  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. python 相对路径和绝对路径的区别

    一,Python中获得当前目录和上级目录 获取当前文件的路径: from os import path d = path.dirname(__file__) #返回当前文件所在的目录 # __file ...

  2. Scrapy项目_苏宁图书信息

     苏宁图书(https://book.suning.com/) 目标: 1.图书一级分类 2.图书二级分类 3.图书三级分类 4.图书名字 5.图书作者 6.图书价格 7.通过Scrapy获取以上数据 ...

  3. Why GraphQL? 6个问题

    Why GraphQL? 6个问题 GraphQL, 是一个API的标准: specification. 对于每个新技术, 要搞清楚的6个问题: 1.这个技术出现的背景, 初衷, 要达到什么样的目标或 ...

  4. 微信小程序:如何删除所有的console.log?

    使用vscode正则匹配,手动去除 1.用vscode打开微信小程序项目 2.Edit-----replace in Files 1. console.log()加了分号 console\.log\( ...

  5. 记录vue springboot 跨域采坑

    vue配置 域名src\main.js要与config\index.js一样 var axios = require('axios')axios.defaults.baseURL = 'http:// ...

  6. 使用Tomcat30分钟搭建个人服务器

    目录 一.服务器简介 二.安装教程 三.出现的问题 一.服务器简介 Tomcat服务器是一个Apache软件资金会的开源项目,实现了Servlet,JSP,EL,WebSocket协议. 二.安装教程 ...

  7. Hi3559AV100外接UVC/MJPEG相机实时采图设计(一):Linux USB摄像头驱动分析

    下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ...

  8. 你好,布尔玛!(BulmaRazor)

    Blazor 官方简介 Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的 ...

  9. Linux速通01 操作系统安装及简介

    操作系统 # a)操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. # 操作系统分为 系统调用接口 和 系统内核 # b)操作系统内核的定义 ...

  10. CVE-2017-10271 XMLDecoder 反序列化

    漏洞描述:WebLogic的 WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,可以构造请求对运行 ...