经典例题:生产者/消费者问题
●生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
●这里可能出现两个问题:
1. 生产者比消费者快时,消费者会漏掉一些数据没有取到。
2. 消费者比生产者快时,消费者会取相同的数据。
分析:
3. 是否是多线程问题? 是,生产者线程,消费者线程
4. 是否有共享数据? 是,店员(或产品)
5. 如何解决线程的安全问题? 同步机制,有三种方法
6. 是否涉及线程的通信? 是
思路:
1. 首先建立店员(Clerk)类,生产者(Productor)类继承Thread,消费者(Customer)类继承Thread
2. 将生产者(Productor)类,消费者(Customer)类都去声明private Clerk clerk这个变量,建立相应构造器;以便实现共用资源。
3. 在主函数中造Clerk对象,new生产者与消费者两个线程。
4. Clerk类中实现生产与消费的具体操作:生产produceProduct(),消费consumeProduct(),并使用synchronized实现线程安全。添加notify()与wait()实现线程通信。
5. Productor与Customer类中各自重写run()方法,分别调用produceProduct(),consumeProduct()
答案:
package com.dxc;
class Clerk{
private int productCount = 0;
//生产产品
public synchronized void produceProduct(){
if (productCount < 20){
productCount++;
System.out.println(Thread.currentThread().getName(