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),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...
随机推荐
- python 相对路径和绝对路径的区别
一,Python中获得当前目录和上级目录 获取当前文件的路径: from os import path d = path.dirname(__file__) #返回当前文件所在的目录 # __file ...
- Scrapy项目_苏宁图书信息
苏宁图书(https://book.suning.com/) 目标: 1.图书一级分类 2.图书二级分类 3.图书三级分类 4.图书名字 5.图书作者 6.图书价格 7.通过Scrapy获取以上数据 ...
- Why GraphQL? 6个问题
Why GraphQL? 6个问题 GraphQL, 是一个API的标准: specification. 对于每个新技术, 要搞清楚的6个问题: 1.这个技术出现的背景, 初衷, 要达到什么样的目标或 ...
- 微信小程序:如何删除所有的console.log?
使用vscode正则匹配,手动去除 1.用vscode打开微信小程序项目 2.Edit-----replace in Files 1. console.log()加了分号 console\.log\( ...
- 记录vue springboot 跨域采坑
vue配置 域名src\main.js要与config\index.js一样 var axios = require('axios')axios.defaults.baseURL = 'http:// ...
- 使用Tomcat30分钟搭建个人服务器
目录 一.服务器简介 二.安装教程 三.出现的问题 一.服务器简介 Tomcat服务器是一个Apache软件资金会的开源项目,实现了Servlet,JSP,EL,WebSocket协议. 二.安装教程 ...
- Hi3559AV100外接UVC/MJPEG相机实时采图设计(一):Linux USB摄像头驱动分析
下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ...
- 你好,布尔玛!(BulmaRazor)
Blazor 官方简介 Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的 ...
- Linux速通01 操作系统安装及简介
操作系统 # a)操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. # 操作系统分为 系统调用接口 和 系统内核 # b)操作系统内核的定义 ...
- CVE-2017-10271 XMLDecoder 反序列化
漏洞描述:WebLogic的 WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,可以构造请求对运行 ...