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. Natapp 邀请码 积分

    邀请码: 29F145FC 充值95折

  2. 从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取、基于ES的简单语义搜索、基于 REfO 的简单KBQA

    从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取.基于ES的简单语义搜索.基于 REfO 的简单KBQA 个人入门知识图谱过程中的学习笔记,算是半教程类的,指引初学者对 ...

  3. 使用C++实现Range序列生成器

    在C++编程中,经常需要迭代一系列数字或其他可迭代对象.通常,这需要编写复杂的循环结构,但有一种精妙的方法可以使这一过程变得更加简单和可读.如果你使用过Python语言那么一定对Range语句非常的数 ...

  4. DBSAT脚本快速收集方法

    DBSAT是Oracle官方提供的脚本,用于数据库的安全评估检查,用户可以放心下载使用. 下载链接具体参见MOS: Oracle Database Security Assessment Tool ( ...

  5. .NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记

    26 | 工程结构概览:定义应用分层及依赖关系 从这一节开始进入微服务实战部分 这一节主要讲解工程的结构和应用的分层 在应用的分层这里定义了四个层次: 1.领域模型层 2.基础设施层 3.应用层 4. ...

  6. 【SpringBootStarter】自定义全局加解密组件

    [SpringBootStarter] 目的 了解SpringBoot Starter相关概念以及开发流程 实现自定义SpringBoot Starter(全局加解密) 了解测试流程 优化 最终引用的 ...

  7. JS Leetcode 26. 删除有序数组中的重复项 题解分析,字典与快慢双指针

    壹 ❀ 引 本题来自LeetCode26. 删除有序数组中的重复项,是一道简单题,题目描述如下: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组 ...

  8. NC22600 Rinne Loves Dynamic Graph

    题目链接 题目 题目描述 Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图. 当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. 定义变 ...

  9. windows远程连接centos及闪退异常解决记录

     平时在学校实验室写代码用的环境是linux系统,放假回家之后之后笔记本的性能和系统多少有些不方便,因此使用服务器安装IDEA进行编程,记录一下远程桌面的安装及出现的问题解决. 一. 安装Centos ...

  10. Centos7 和 Centos8 升级内核

    从yum安装kernel-ml 对于Centos7 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install htt ...