java 生产者和消费者——ReentrantLock方式详解编程语言

java 生产者和消费者——Synchronized方式

java 生产者和消费者——ReentrantLock方式

java 生产者和消费者——BlockingQueue方式

/** 
 * 生产者消费者问题: 容器最多放5个商品;当容器未装满时,生产者一直生产商品并放入容器中,当容器中有商品时,消费者就一直消费商品; 情景: 
 * 生产者生产20个商品并被消费者消费 
 */ 
public class ProducerAndComsumerDemo {
    
	private int pruductsSum = 0; 
	private int FULL = 5;// 容器中最多容纳5个产品 
	private Lock lock; 
	private Condition notEmptyCondition; 
	private Condition notFullCondition; 
	private ProducerAndComsumerDemo() {
    
		lock = new ReentrantLock(); 
		notEmptyCondition = lock.newCondition(); 
		notFullCondition = lock.newCondition(); 
	} 
	public static void main(String[] args) {
    
		ProducerAndComsumerDemo demo1 = new ProducerAndComsumerDemo(); 
		new Thread(demo1.new Producer()).start(); 
		new Thread(demo1.new Consumer()).start(); 
	} 
	class Producer implements Runnable {
    
 
		@Override 
		public void run() {
    
			for (int i = 0; i < 20; i++) {
    
				try {
    
					Thread.sleep(150); 
				} catch (InterruptedException e) {
    
					e.printStackTrace(); 
				} 
				lock.lock(); 
				try {
    
					while (pruductsSum == FULL) {
    
						try {
    
							System.out.println("容器里剩余" + pruductsSum + "个,生产者wait"); 
							notFullCondition.await(); 
						} catch (InterruptedException e) {
    
							e.printStackTrace(); 
						} 
					} 
					System.out.println("生产者 生产前 总共有 " + pruductsSum + " 个商品"); 
					pruductsSum++; 
					System.out.println("生产者  生产后 总共有 " + pruductsSum + " 个商品"); 
					System.out.println("---------------------------------------------------------------------------"); 
					notEmptyCondition.signal(); 
				} finally {
    
					lock.unlock(); 
				} 
			} 
		} 
	} 
	class Consumer implements Runnable {
    
		@Override 
		public void run() {
    
			for (int i = 0; i < 20; i++) {
    
				try {
    
					Thread.sleep(300); 
				} catch (InterruptedException e) {
    
					e.printStackTrace(); 
				} 
				lock.lock(); 
				try {
    
					while (pruductsSum == 0) {
    
						try {
    
							notEmptyCondition.await(); 
						} catch (InterruptedException e) {
    
							e.printStackTrace(); 
						} 
					} 
					System.out.println("消费者 消费前 总共有 " + pruductsSum + " 个商品"); 
					pruductsSum--; 
					System.out.println("消费者 消费后 总共有 " + pruductsSum + " 个商品"); 
					System.out.println("---------------------------------------------------------------------------"); 
					notFullCondition.signal(); 
				} finally {
    
					lock.unlock(); 
				} 
			} 
		} 
	} 
} 

运行结果的其中一次日志

生产者 生产前 总共有 0 个商品 
生产者  生产后 总共有 1 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 1 个商品 
消费者 消费后 总共有 0 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 0 个商品 
生产者  生产后 总共有 1 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 1 个商品 
生产者  生产后 总共有 2 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 2 个商品 
消费者 消费后 总共有 1 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 1 个商品 
生产者  生产后 总共有 2 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 2 个商品 
生产者  生产后 总共有 3 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 3 个商品 
消费者 消费后 总共有 2 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 2 个商品 
生产者  生产后 总共有 3 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 3 个商品 
生产者  生产后 总共有 4 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 4 个商品 
消费者 消费后 总共有 3 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 3 个商品 
生产者  生产后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
容器里剩余5个,生产者wait 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
生产者 生产前 总共有 4 个商品 
生产者  生产后 总共有 5 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 5 个商品 
消费者 消费后 总共有 4 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 4 个商品 
消费者 消费后 总共有 3 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 3 个商品 
消费者 消费后 总共有 2 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 2 个商品 
消费者 消费后 总共有 1 个商品 
--------------------------------------------------------------------------- 
消费者 消费前 总共有 1 个商品 
消费者 消费后 总共有 0 个商品 
--------------------------------------------------------------------------- 
 

仅此记录

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18738.html

(0)
上一篇 2021年7月19日 21:27
下一篇 2021年7月19日 21:27

相关推荐

发表回复

登录后才能评论