操作系统-多线程通信-生产者消费者问题 JAVA

文章目录

  • 一、题目描述
  • 二、问题分析
    • 1.是否是多线程?
    • 2.是否有数据共享?
    • 3.如何解决线程安全问题?
    • 4.是否涉及线程通信?
  • 三:问题解决
    • 3.1源代码
    • 3.2运行结果
  • 写在最后


注:本文程序以及分析思路主要参考 全网最全Java零基础入门教程 仅供大家讨论交流之用,侵删


一、题目描述

经典例题:生产者/消费者问题

  • 生产者(Productor) 将产品交给 店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停-下,如果店中有空位放产品了再通知生产者继续生产:如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
  • 这里可能出现两个问题:
    ➢生产者比消费者快时,消费者会漏掉一些数据没有取到。
    ➢消费者比生产者快时,消费者会取相同的数据。

二、问题分析

1.是否是多线程?

是,生产者线程,消费者线程

2.是否有数据共享?

是,店员或者产品

3.如何解决线程安全问题?

同步机制,有三种方法

4.是否涉及线程通信?

是,例如货物满了,应该让Producer停止生产


三:问题解决

3.1源代码

package ComsumerPoducerQ;

/**
 * @Author FeverTwice
 * @Create 2021-06-14
 * @Func 线程通信的应用
 * 

* 分析: * 1.是否是多线程? * 是,生产者线程,消费者线程 * 2.是否有数据共享? * 是,店员或者产品 * 3.如何解决线程安全问题? * 同步机制,有三种方法 * 4.是否涉及线程通信? * 是 */ class Clerk { private int productCount = 0; //生产产品 public synchronized void produceProduct() { //要对下面的判断操作限制只有一个线程去做,不然就会有冲突 //加同步监视器synchronized () if (productCount < 20) { //等于不能再生产了 productCount++; System.out.println(Thread.currentThread().getName() + ":开始生产" + productCount + "个产品"); notify(); //只要产出一个了,就可以唤醒对方,让他继续消费 } else { //等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } //消费产品 public synchronized void consumeProduct() { if (productCount > 0) { System.out.println(Thread.currentThread().getName() + ":开始消费第" + productCount + "个产品"); productCount--; //注意输出顺序 notify(); //只要消费一个了,就可以唤醒对方,让他继续生产 }else { //等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Producer extends Thread { //生产者 private Clerk clerk; public Producer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { System.out.println(getName() + ":开始生产产品......"); while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } clerk.produceProduct(); } } } class Consumer extends Thread { //消费者 private Clerk clerk; public Consumer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { System.out.println(getName() + ":开始消费产品......"); while (true) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } clerk.consumeProduct(); } } } public class ProductTest { public static void main(String[] args) { Clerk clerk = new Clerk(); Producer p1 = new Producer(clerk); p1.setName("生产者1"); Consumer c1 = new Consumer(clerk); c1.setName("消费者1"); Consumer c2 = new Consumer(clerk); c2.setName("消费者2"); p1.start(); c1.start(); c2.start(); } }

3.2运行结果

这里大家可以尝试着设置sleep的时间或者创建多个消费者来观察实验结果
我在这里创建了一个消费者(睡10ms)和创建了两个消费者(各睡20ms),所得运行结果如下:

操作系统-多线程通信-生产者消费者问题 JAVA_第1张图片


写在最后

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

你可能感兴趣的:(操作系统,多线程,java,编程语言,操作系统,线程安全)