随笔 - 322  文章 - 0  评论 - 4  阅读 - 77146

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 }
复制代码

 

 ........

posted on   Bytezero!  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示