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),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...
随机推荐
- styled-components all in one
styled-components all in one CSS in JS https://www.styled-components.com/ https://github.com/styled- ...
- css border-radius & yin-yang & taiji
css border-radius & yin-yang & taiji solution css border-radius & tabs effect https://co ...
- taro 小程序 & touch event 转换 bug
taro 小程序 & touch event 转换 bug before after 事件处理 https://nervjs.github.io/taro/docs/event.html#do ...
- Node.js Debugger
Node.js Debugger VS Code & Chrome DevTools https://nodejs.org/api/debugger.html https://nodejs.o ...
- 人物传记——Kyle Tedford:持之以恒的品质从哪里来?
心理学家表示,95%的人类行为发生在无意识中,而大多数这种行为是由习惯引起的.习惯,就像我们大脑设定的程序.通过每日持续努力,你会把坚持的习惯节奏慢慢进入身体中,并且会很容易加持下去. 做事三分钟热度 ...
- SharedPreferences 数据传输中遇到的一些问题总结
原构想:MainActivity 设置两个按钮,btn1--跳转Main2Activity通过复选框组选择并提交,btn2--跳转Main3Activity通过RecycleView显示选择结果. 主 ...
- 刚学会 C++ 的小白用这个开源框架,做个 RPC 服务要多久?
本文适合有 C++ 基础的朋友 本文作者:HelloGitHub-Anthony HelloGitHub 推出的<讲解开源项目>系列,本期介绍基于 C++ 的 RPC 开源框架--rest ...
- 微信小程序引入ECharts组件
首先打开ECharts网页 https://echarts.apache.org/zh/tutorial.html#%E5%9C%A8%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8 ...
- iOS拍照定制之AVCaptureVideoDataOutput
问题 领导看了前面做的拍照,问了句"哪来的声音", "系统的,自带的,你看系统的拍照也有声音" "有办法能去掉吗?挺糟心的" "我 ...
- Guava - LoadingCache实现Java本地缓存
前言 Guava是Google开源出来的一套工具库.其中提供的cache模块非常方便,是一种与ConcurrentMap相似的缓存Map. 官方地址:https://github.com/google ...