Loading... ## 题目: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-2544bb49265f56419e273d7f589c19b577" aria-expanded="true"><div class="accordion-toggle"><span>生产者/消费者问题</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-2544bb49265f56419e273d7f589c19b577" class="collapse in collapse-content"><p></p> * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品, * 店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品, * 店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产; * 如果店中没有产品了,店员会告诉消费者等一下, * 如果店中有产品了再通知消费者来取走产品。 <p></p></div></div></div> ## 分析: <div class="tip inlineBlock success"> 1.是否是多线程的问题?是,生产者的线程,消费者的线程 2.是否有共享数据的问题?是,店员、产品、产品数 3.如何解决线程的安全问题?同步机制,有三种方法 4.是否涉及线程的通信?是 </div> ## 代码实现: ```java package Text2; /** * @Author BenDangMi * @Date 2021/11/7 12:42 * @Version 1.0 */ class Clerk { //产品数量 private int product = 0; //生产者生产 public synchronized void produce() { if(product <= 20){ product++; System.out.println(Thread.currentThread().getName() + "开始生产第" + product + "个产品!"); notify(); }else{ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } //消费者消费 public synchronized void consumption() { if(product > 0){ System.out.println(Thread.currentThread().getName() + "开始消费第" + product + "个产品!"); product--; notify(); }else{ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } //生产者 class Producer extends Thread{ private final Clerk clerk; public Producer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { while(true){ try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } clerk.produce(); } } } //消费者 class Customer extends Thread{ private final Clerk clerk; public Customer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { while(true){ try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } clerk.consumption(); } } } public class Main { public static void main(String[] args) { //员工中介 Clerk clerk = new Clerk(); //生产者 Producer producer = new Producer(clerk); producer.setName("生产者:"); //消费者 Customer customer = new Customer(clerk); customer.setName("消费者一号:"); Customer customer1 = new Customer(clerk); customer1.setName("消费者二号:"); producer.start(); customer.start(); customer1.start(); } } ``` 最后修改:2022 年 03 月 06 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果文章有用,请随意打赏。
5 条评论
多线程,tql。
卷起来!
你javaSE还差多少?
大概还有150集左右
牛啊,我也要卷