文档目录:

一、概念

二、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. html template tag

    html template tag const tagName = `emoji-element`; const template = document.createElement('template ...

  2. html->pdf直接下载

    import html2Canvas from 'html2canvas' import JsPDF from 'jspdf' export default{ install (Vue, option ...

  3. Flutter: random color

    import 'dart:math' as math; import 'package:flutter/material.dart'; void main() => runApp(App()); ...

  4. VS Code使用Git可视化管理源代码详细教程

    前言: 随着VS Code的功能和插件的不断强大和完善,它已经成为了我们日常开发中一个必不可缺的伙伴了.在之前我曾经写过一篇SourceTree使用教程详解(一个git可视化管理神器,想要了解的话可以 ...

  5. 一周精彩内容分享(第 3 期):开工大吉的 B 面

    这里记录过去一周,我看到的值得分享的东西. 一方面是整理记录一下自己一周的学习,另一方面也是期待自己有更多的输出,有更多的价值. 周刊开源(Github:wmyskxz/weekly),欢迎提交 is ...

  6. 记一个关于std::unordered_map并发访问的BUG

    前言 刷题刷得头疼,水篇blog.这个BUG是我大约一个月前,在做15445实现lock_manager的时候遇到的一个很恶劣但很愚蠢的BUG,排查 + 摸鱼大概花了我三天的时间,根本原因是我在使用s ...

  7. nginx+php-fpm docker镜像合二为一

    一.概述 在上一篇文章介绍了nginx+php-fpm,链接如下: https://www.cnblogs.com/xiao987334176/p/12918413.html nginx和php-fp ...

  8. CentOS 7.7+ Python3.7 下安装virtualenv和virtualenvwrapper

    1. 安装virtualenv和virtualenvwrapper # pip install virtualenv # pip install virtualenvwrpper 2. 寻找virtu ...

  9. Docker搭建HAproxy+tomcat 实现高可用

    构建业务镜像1创建tomcat-app1和tomcat-app2两个目录,代表不同的两个基于tomcat的业务.准备tomcat的配置文件[root@localhost ~]#mkdir -p /da ...

  10. 第01章-Java SE8的流库

    从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...