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. 一个Promise指定多个成功或者失败的回调详解

    // 当一个Promise指定多个成功或者失败的回调:都会调用吗? 会的 let p = new Promise((resolve, reject) => { resolve('第一种成功1') ...

  2. VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等

    VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答.图文匹配.图片分类.常识推理等 多模态预训练模型通过在多种模态的大规模数据上的预训练,可以综合利用来自不同模态的信息,执行各种 ...

  3. 强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示

    强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示 强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域,区别与监督学习和无监 ...

  4. Postfix + Extmail 企业邮件服务器搭建

    ExtMail套件用于提供从浏览器中登录.使用邮件系统的Web操作界面,而Extman套件用于提供从浏览器中管理邮件系统的Web操作界面.它以GPL版权释出,设计初衷是希望设计一个适应当前高速发展的I ...

  5. C++ Boost 文件系统相关函数

    基础处理 #include <iostream> #include <boost/foreach.hpp> #include <boost/filesystem.hpp& ...

  6. Yarp 与 Nginx性能大比拼不出所料它胜利了!

    Yarp 与 Nginx 性能大比拼 测试环境: Ubuntu 22.04.3 LTS (GNU/Linux 6.5.0-14-generic x86_64) Intel(R) Xeon(R) CPU ...

  7. php批量更新多条数据

    /** * @param $table 表名 * @param array $multipleData 拼接的批量更新的数组格式: * $students = [['id' => 1, 'cit ...

  8. C++遴选出特定类型的文件或文件名符合要求的文件

      本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法.   首先,我们来明确一下本文所需实现的需求.现在有一个文件夹,其中包含了很多文件,如下图所示:我们如果想获取其中所 ...

  9. Vulkan学习苦旅05:马不停蹄地渲染(创建交换链VkSwapchainKHR)

    通俗地说,渲染图像就是为图像的每个像素选择合适的颜色.例如,如果图像的分辨率为1920x1080,表示图像中有1920x1080个像素,渲染的过程,就是为每个位置的像素计算出合适的颜色.具体来说,假设 ...

  10. TfrxReport.Clear。尽量慎用。

    for MyXuHaoKey in MyXuHaoJianRongSanJieKouDataDicApi.KeySortList do begin //标记下打印编号,吸入淘打的客户 MyTradeA ...