zoukankan      html  css  js  c++  java
  • 线程通信的应用 经典例题: 生产者/消费者问题

      1 package day2_4;
      2 
      3 /**
      4  * 线程通信的应用 经典例题: 生产者/消费者问题
      5  * <p>
      6  * 生产者(Productor)将产品交给店员(Clerk),而消费者(Consumer)从店员处取走产品,
      7  * 店员一次只能持有固定数量范围的产品(比如 1-20个)
      8  * 如果生产者试图生产更多的产品,店员会叫生产者停一下,等店中有空位放产品了再通知生产者继续生产。
      9  * 如果店中没有产品了,店员会告诉消费者等一下,等店中有产品了再通知消费者来取走产品
     10  * <p>
     11  * 分析:
     12  * 1.是否是多线程问题? 是  生产者线程、消费者线程
     13  * 2.是否有共享数据? 是  店员(或产品)
     14  * 3.如何解决线程的安全问题?  同步机制,有三种方法
     15  * 4.是否涉及线程通信? 是
     16  *
     17  * @Author Tianhao
     18  * @create 2021-02-05-23:42
     19  */
     20 
     21 //店员
     22 class Clerk {
     23     //产品数量
     24     private int productCount;
     25 
     26     public Clerk(int productCount) {
     27         this.productCount = productCount;
     28     }
     29 
     30     //生产产品
     31     public synchronized void produceProduct() {
     32 
     33         if (productCount < 20) {
     34             productCount++;
     35             System.out.println(Thread.currentThread().getName() + "成产了第"
     36                     + productCount + "个产品");
     37             //每生产了一个产品,就唤醒wait中的消费者
     38             notify();
     39 
     40         } else {
     41             try {
     42                 //等待
     43                 wait();
     44             } catch (InterruptedException e) {
     45                 e.printStackTrace();
     46             }
     47         }
     48     }
     49 
     50     //消费产品
     51     public synchronized void customProduct() {
     52         if (productCount > 0) {
     53             System.out.println(Thread.currentThread().getName() + "消费了第"
     54                     + productCount + "个产品");
     55             productCount--;
     56             //每消费了一个产品,就唤醒正在wait的生产者
     57             notify();
     58         } else {
     59             try {
     60                 //等待
     61                 wait();
     62             } catch (InterruptedException e) {
     63                 e.printStackTrace();
     64             }
     65         }
     66     }
     67 }
     68 
     69 
     70 //生产者
     71 class Productor extends Thread{
     72     private Clerk clerk;
     73 
     74     public Productor(Clerk clerk) {
     75         this.clerk = clerk;
     76     }
     77 
     78     @Override
     79     public void run() {
     80         System.out.println("生产者开始生产产品...");
     81         while (true) {
     82             try {
     83                 Thread.sleep(10);
     84             } catch (InterruptedException e) {
     85                 e.printStackTrace();
     86             }
     87             clerk.produceProduct();
     88         }
     89     }
     90 }
     91 
     92 //消费者
     93 class Consumer extends Thread{
     94     private Clerk clerk;
     95 
     96     public Consumer(Clerk clerk) {
     97         this.clerk = clerk;
     98     }
     99 
    100     @Override
    101     public void run() {
    102         System.out.println("消费者开始消费产品...");
    103         while (true) {
    104             try {
    105                 Thread.sleep(20);
    106             } catch (InterruptedException e) {
    107                 e.printStackTrace();
    108             }
    109             clerk.customProduct();
    110         }
    111     }
    112 }
    113 
    114 public class ProductTest {
    115     public static void main(String[] args) {
    116         Clerk clerk = new Clerk(0);
    117         Productor p = new Productor(clerk);
    118         Consumer c = new Consumer(clerk);
    119         Consumer c2 = new Consumer(clerk);
    120         p.setName("生产者1");
    121         c.setName("消费者1");
    122         c2.setName("消费者2");
    123         p.start();
    124         c.start();
    125         c2.start();
    126 
    127     }
    128 
    129 }
  • 相关阅读:
    证明最大公约数Stein算法(高精度算法)
    链表常用内容和易犯错误
    斐波那契数列——各种公式证明
    用矩阵和待定系数法求数列的分析(复杂度log(n))
    盒模型(外边距)
    盒子模型(内边距)
    盒子模型(边框)
    jupyterhub
    1分钟k线图能反映什么?(转)
    python的self
  • 原文地址:https://www.cnblogs.com/zui-ai-java/p/14380942.html
Copyright © 2011-2022 走看看