1 package bytezero.threadcommunication;
2
3 /**
4 * 线程通信的应用:经典例题:生产者/消费者问题
5 *
6 *
7 *
8 * @author Bytezero1·zhenglei! Email:420498246@qq.com
9 * create 2021-10-18 16:10
10 */
11
12 //店员
13 class Clerk{
14
15 private int productCount = 0;
16 //生产产品
17 public synchronized void produceProduct() {
18
19 if(productCount < 20){
20 productCount++;
21 System.out.println(Thread.currentThread().getName() +":开始生产第"+productCount+"个产品");
22
23 notify(); //唤醒消费者
24
25 }else{
26 //等待
27 try {
28 wait();
29 } catch (InterruptedException e) {
30 e.printStackTrace();
31 }
32 }
33
34 }
35
36 //消费产品
37 public synchronized void consumerProduct() {
38 if(productCount > 0){
39 System.out.println(Thread.currentThread().getName()+":开始消费第"+productCount+"个产品");
40 productCount--;
41
42 notify();//唤醒生产者
43
44 }else{
45 //等待
46 try {
47 wait();
48 } catch (InterruptedException e) {
49 e.printStackTrace();
50 }
51 }
52 }
53 }
54
55 //生产者
56 class Producer extends Thread {
57 private Clerk clerk;
58
59 public Producer(Clerk clerk) {
60 this.clerk = clerk;
61 }
62
63 @Override
64 public void run() {
65 System.out.println(Thread.currentThread().getName() +":开始生产产品....");
66
67 while (true){
68 try {
69 Thread.sleep(10);
70 } catch (InterruptedException e) {
71 e.printStackTrace();
72 }
73 clerk.produceProduct();
74 }
75
76 }
77 }
78
79 //消费者
80 class Consumer extends Thread{
81 private Clerk clerk;
82
83 public Consumer(Clerk clerk) {
84 this.clerk = clerk;
85 }
86
87 @Override
88 public void run() {
89 System.out.println(Thread.currentThread().getName() +":开始消费产品....");
90
91 while (true){
92 try {
93 Thread.sleep(20);
94 } catch (InterruptedException e) {
95 e.printStackTrace();
96 }
97 clerk.consumerProduct();
98 }
99 }
100
101 }
102 public class ProductTest {
103 public static void main(String[] args) {
104 Clerk clerk = new Clerk();
105
106 Producer p1 = new Producer(clerk);
107 p1.setName("生产者1");
108
109 Consumer c1 = new Consumer(clerk);
110 c1.setName("消费者1");
111
112 Consumer c2 = new Consumer(clerk);
113 c2.setName("消费者2");
114
115 p1.start();
116 c1.start();
117 c2.start();
118
119 }
120 }

........

Java 线程通信的应用:经典例题:生产者/消费者问题的更多相关文章

  1. java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法

    在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...

  2. Java线程通信-生产者消费者问题

    线程通信示例——生产者消费者问题 这类问题描述了一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费.假设仓库中没有产品,则生产者可以将 产品放入仓库,有 ...

  3. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  4. Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...

  5. Linux 进程间通信(包含一个经典的生产者消费者实例代码)

    前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...

  6. JAVA线程通信之生产者与消费者

    package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...

  7. java并发编程(十三)经典问题生产者消费者问题

    生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据&q ...

  8. Java 线程通信

    线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...

  9. JAVA多线程经典问题 -- 生产者 消费者

    工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...

  10. java线程通信与协作小结 多线程中篇(十六)

      在锁与监视器中我们对Object中的方法进行了简单介绍 以监视器原理为核心,三个方法:wait,notify.notifyAll,可以完成线程之间的通信 当然,不会像“语言”似的,有多种多样的沟通 ...

随机推荐

  1. 【发现一个问题】VictoriaMetrics中,vm-select与vm-storage之间的协议存在版本兼容性问题

    使用中发现,vm-select 1.76版本,查询vm-storage的1.70版本,报以下错误: cannot execute rpcName="search_v5" on vm ...

  2. ngnix在linux安装并设置反向代理

    一.nginx安装 1.安装Nginx依赖的环境 安装Nginx依赖的gcc的编译环境: yum install gcc-c++ Nginx的http模块需要使用pcre来解析正则表达式,需要安装pc ...

  3. 微信小程序-Storage

    官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.setStorageSync.html ?> Sto ...

  4. 【任务调度】Spring 的动态定时任务之 ScheduledTaskRegistrar(解决方案一)

    前言 ​ 在做SpringBoot项目的过程中,有时客户会提出按照指定时间执行一次业务的需求. ​ 如果客户需要改动业务的执行时间,即动态地调整定时任务的执行时间,那么可以采用SpringBoot自带 ...

  5. 解锁数据潜力:信息抽取、数据增强与UIE的完美融合

    解锁数据潜力:信息抽取.数据增强与UIE的完美融合 1.信息抽取(Information Extraction) 1.1 IE简介 信息抽取是 NLP 任务中非常常见的一种任务,其目的在于从一段自然文 ...

  6. C/C++ Zlib实现文件压缩与解压

    在软件开发和数据处理中,对数据进行高效的压缩和解压缩是一项重要的任务.这不仅有助于减小数据在网络传输和存储中的占用空间,还能提高系统的性能和响应速度.本文将介绍如何使用 zlib 库进行数据的压缩和解 ...

  7. C/C++ 进程线程操作技术

    手动创建单进程: 下面通过一个实例来分别演示进程的创建函数. #include <windows.h> #include <stdio.h> BOOL WinExec(char ...

  8. rpm安装卸载jdk

    安装 rpm -ivh jdk-7-linux-x64.rpm 卸载 先查看安装的包 rpm -qa | grep jdk 卸载 rpm -e --nodeps jdk-1.7.0-fcs.x86_6 ...

  9. 苹果iOS 17.2年底推送:iPhone 15 Pro的自定义操作按钮功能升级

    据报道,苹果会在年底推送iOS 17.2版本,新版系统将会修复iPhone 15系列WiFi速度慢的问题. 与此同时,iOS 17.2将会带来翻译功能,iPhone 15 Pro的自定义操作按钮切换到 ...

  10. SpringBoot中优雅地实现统一响应对象

    目录 前言 实现步骤 定义统一响应对象类 定义一个忽略响应封装的注解 实现ResponseBodyAdvice接口 定义Controller类 总结 前言 近日心血来潮想做一个开源项目,目标是做一款可 ...