Java多线程(一)——生产者消费者模型之单生产单消费

生产者—消费者问题产生的条件

条件:生产者线程Pp和消费者线程Pc同步,各Pp(Pc)间互斥。

互斥:可以简单理解为,某一公共资源不允许两个及以上并发线程同时访问。
同步:因并发线程各自的执行结果互为对方执行条件(直接制约),使各线程按一定速度执行的过程。

生产者:增加资源,超出最大容量时停止生产,直到小于最大容量再重新开始生产。
消费者:消耗资源,容量为空时停止消耗,直到有了资源再重新开始消耗。

synchronized关键字

简单看一下,加对象锁的方式

synchronized(MyClass.class){
    
    
	
}

这样就给MyClass.class对象加上了一个对象锁。
干嘛要加锁? 我前面写过,生产者-消费者问题产生的条件一个是同步一个是互斥,生产者消费者问题天然满足同步条件,synchronized则为互斥提供条件。

Java代码实现单生产单消费

思路:一个Goods类,创建Goods类列表goods;一个Producer类,一个Consumer类,列表最大空间设为10;空间为10时,Producer线程进入wait(),空间为0时,Consumer线程进入wait()。不管是生产还是消费,都要发送notify()消息。

import java.util.ArrayList;
import java.util.List;

public class Main {
    
    

	public static void main(String[] args) {
    
    
		Main m = new Main();
		List<Goods> goods = new ArrayList<>();
		Thread p = new Thread(m.new Producer(goods));
		Thread c = new Thread(m.new Consumer(goods));
		p.start();
		c.start();
	}

	class Goods {
    
    }

	class Producer implements Runnable {
    
    
		final int MAX_SIZE = 10;
		private List<Goods> goods;
		public Producer(List<Goods> goods) {
    
    
			this.goods = goods;
		}

		@Override
		public void run() {
    
    
			// TODO Auto-generated method stub
			while (true) {
    
    
				if (MAX_SIZE == goods.size()) {
    
    
					System.out.println("货架已满");
					synchronized (goods) {
    
    
						try {
    
    
							goods.wait();
						} catch (InterruptedException e) {
    
    
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				} else {
    
    
					Goods g = new Goods();
					goods.add(g);
					System.out.println("生产,货架已有商品:" + goods.size());
					synchronized (goods) {
    
    
						goods.notify();
					}
				}
				try {
    
    
					Thread.sleep(1000);
				} catch (InterruptedException e) {
    
    
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	class Consumer implements Runnable {
    
    

		private List<Goods> goods;

		public Consumer(List<Goods> goods) {
    
    
			this.goods = goods;
		}

		@Override
		public void run() {
    
    
			// TODO Auto-generated method stub
			while (true) {
    
    
				if (goods.size() > 0) {
    
    
					goods.remove(0);
					System.out.println("消费,货架还剩商品:" + goods.size());
					synchronized (goods) {
    
    
						goods.notify();
					}
				} else {
    
    
					System.out.println("货架已空");
					synchronized (goods) {
    
    
						try {
    
    
							goods.wait();
						} catch (InterruptedException e) {
    
    
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
				try {
    
    
					Thread.sleep(1200);
				} catch (InterruptedException e) {
    
    
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

欢迎大家交流讨论,有错误还望大家指出,一起进步鸭!vx:iwxid_dezforever66

猜你喜欢

转载自blog.csdn.net/weixin_45651194/article/details/109347833