Java 线程通信的应用:经典例题:生产者/消费者问题

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 线程通信的应用:经典例题:生产者/消费者问题的更多相关文章
- java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法
在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...
- Java线程通信-生产者消费者问题
线程通信示例——生产者消费者问题 这类问题描述了一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费.假设仓库中没有产品,则生产者可以将 产品放入仓库,有 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- Java线程通信
Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...
- Linux 进程间通信(包含一个经典的生产者消费者实例代码)
前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...
- JAVA线程通信之生产者与消费者
package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...
- java并发编程(十三)经典问题生产者消费者问题
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据&q ...
- Java 线程通信
线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...
- JAVA多线程经典问题 -- 生产者 消费者
工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...
- java线程通信与协作小结 多线程中篇(十六)
在锁与监视器中我们对Object中的方法进行了简单介绍 以监视器原理为核心,三个方法:wait,notify.notifyAll,可以完成线程之间的通信 当然,不会像“语言”似的,有多种多样的沟通 ...
随机推荐
- mysql系列基础篇01---通用的语法及分类
通用语法及分类 DDL: 数据定义语言,用来定义数据库对象(数据库.表.字段) DML: 数据操作语言,用来对数据库表中的数据进行增删改 DQL: 数据查询语言,用来查询数据库中表的记录 DCL: 数 ...
- 【windows Server 2019系列】 构建IIS服务器
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Web服务器也称为WWW(World Wide W ...
- errgroup的常见误用
errgroup想必稍有经验的golang程序员都应该听说过,实际项目中用过的也应该不在少数.它和sync.WaitGroup类似,都可以发起执行并等待一组协程直到所有协程运行结束.除此之外errgr ...
- 8.5 CheckRemoteDebuggerPresent
CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用.函数接收两个参数进程句柄和一个指向布尔值的指针.如果指定的进程正在被调试,则函数 ...
- 常见的WCF面试问题
WCF和ASMX WebService的区别是什么? 最基本的区别在于,ASMX或者ASP.NET WebService是用来通过基于HTTP的SOAP来实现通讯.但WCF可以使用任意协议(HTTP, ...
- maven打包报错
* 系统:macOS* 开发工具:Idea* 问题描述:在idea中执行mvn clean install时报No compiler is provided in this environment. ...
- P9989 [Ynoi Easy Round 2023] TEST_69 题解
题目链接: [Ynoi Easy Round 2023] TEST_69 首先GCD有比较良好的一些性质.我们观察到一次 \(GCD(a_i,x)\) 操作,会有以下两种变化. 如果 \(x \bmo ...
- Go语言的100个错误使用场景(21-29)|数据类型
目录 前言 3. Data types 3.5 低效的切片初始化(#21) 3.6 切片为 nil 与为空混淆(#22) 3.7 没有正确检查切片是否为空(#23) 3.8 错误的切片拷贝(#24) ...
- 教你用JavaScript实现表情评级
案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个表情评价程序.用户打星进行评价,表情会根据具体星星数量发生变化. 案例演示 点击星星 ...
- Postgresql-数据库无法停止,报错:pg_ctl server does not shut down
根据您的查询,pg_ctl server does not shut down(pg_ctl服务无法关闭)的原因可能有很多.以下是一些可能的解决方案和代码示例: (1)杀死所有与PostgreSQL相 ...