多线程实例-生产者消费者实例

问题

生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,
店员一次只能持有固定数量的产品(比如:20),
如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;
如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。

这里可能出现两个问题:

1.生产者比消费者快时,消费者会漏掉一些数据没有取到。
2.消费者比生产者快时,消费者会取相同的数据

分析问题:

1.使用多线程:生产者和消费者
2.共享数据:当前产品的数量
3.线程的通信问题:存在生产者和消费者的通信

实现代码:

// 店员
class Clerk {
    // 产品
    int product;

    // 生产产品的方法
    public synchronized void addProduct() {
	if (product >= 20) {
	    try {
		wait();
	    } catch (InterruptedException e) {
		e.printStackTrace();
	    }
	} else {
	    product++;
	    System.out.println(Thread.currentThread().getName() + "生产了第" + product + "个产品");
	    notifyAll();
	}
    }
 // 消费产品的方法
    public synchronized void consumeProduct() {
	if (product <= 0) {
	    try {
		wait();
	    } catch (InterruptedException e) {
		e.printStackTrace();
	    }
	}else {
	    product--;
	    System.out.println(Thread.currentThread().getName() + "消费了第" + product + "个产品");
	    notifyAll();
	}
    }
}
// 生产者
class Producer implements Runnable{
    Clerk clerk;
    
     public Producer(Clerk clerk) {
	 this.clerk=clerk;
    }
     
    @Override
    public void run() {
	// 生产产品
	System.out.println("生产者开始生产产品...");
	while (true) {
	    try {
		Thread.currentThread().sleep(100);
	    } catch (InterruptedException e) {
		e.printStackTrace();
	    }
	    // 调用生产产品的方法
	    clerk.addProduct();
	}
    }
    
}
// 消费者
class Consumer implements Runnable{
    
    Clerk clerk;
    
    public Consumer(Clerk clerk){
	this.clerk=clerk;
    }
    
    @Override
    public void run() {
	 // 消费产品
	System.out.println("开始消费产品...");
	while (true) {
	    try {
		Thread.currentThread().sleep(100);
	    } catch (InterruptedException e) { 
		e.printStackTrace();
	    }
	    // 调用消费产品的方法
	    clerk.consumeProduct();
	}
	
    }

}
public class TestProduce {
    public static void main(String[] args) {
	Clerk clerk = new Clerk();
	// 创建生产者和消费者对象
	Producer p1 = new Producer(clerk);
	Consumer c1 = new Consumer(clerk);
	// 创建生产者的线程
	Thread t1 = new Thread(p1);
	Thread t3 = new Thread(p1);
	// 创建消费者的线程
	Thread t2 = new Thread(c1);
	
	t1.setName("生产者1");
	t2.setName("消费者2");
	t3.setName("生产者2");
	
	t1.start();
	t2.start();
	t3.start();
    }
}
发布了38 篇原创文章 · 获赞 0 · 访问量 538
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览