多线程-生产者消费者代码,使用synchronized实现(等待唤醒机制),多个生产线程多个消费线程

package com.spring.boot.entity;

import java.util.ArrayDeque;
import java.util.Queue;

public class ProducerAndConsumer {
	public static void main(String[] args) {
		
		Queue<Product> queue = new ArrayDeque<>();
        new Thread(new Producer(queue, 100),"p1").start();
        new Thread(new Producer(queue, 100),"p2").start();
        new Thread(new Consumer(queue, 100),"c1").start();
        new Thread(new Consumer(queue, 100),"c2").start();
		
		
		//等效写法
		/*Queue<Product> queue = new ArrayDeque<>();
		Producer producer1  = new Producer(queue,100);
		new Thread(producer1,"p1").start();
		Producer producer2  = new Producer(queue,100);
		new Thread(producer2,"p2").start();
		Consumer consumer1  = new Consumer(queue,100);
		new Thread(consumer1,"c1").start();
		Consumer consumer2  = new Consumer(queue,100);
		new Thread(consumer2,"c2").start();*/
	}
}
package com.spring.boot.entity;

public class Product {
	
	private String name;

    public Product(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}
package com.spring.boot.entity;

import java.util.Queue;

public class Producer implements Runnable{
		private Queue<Product> queue;
	    private int maxCapacity;
	    
	    //容器计数器
	    private int count;

	    public Producer(Queue<Product> queue, int maxCapacity) {
	        this.queue = queue;
	        this.maxCapacity = maxCapacity;
	    }
	    
	    

	    @Override
	    public void run() {
	    	while(true) {
	    		synchronized (this) {
	    			//如果容器满了,就需要等待消费者消费
		            while (queue.size() == maxCapacity) {
		                try {
		                    System.out.println("生产者" + Thread.currentThread().getName() + "等待中... Queue 已达到最大容量,无法生产");
		                    //通知消费者消费,生产等待
		                    this.wait();
		                    System.out.println("生产者" + Thread.currentThread().getName() + "退出等待");
		                } catch (InterruptedException e) {
		                    e.printStackTrace();
		                }
		            }
		            //如果没有满,我们就需要丢入产品
		            queue.offer(new Product("面包"));
		             //可以通知消费者消费了
		            this.notifyAll();
		            this.count++;
		            System.out.println("生产者:" + Thread.currentThread().getName() + " 共生产了:" + this.count + "件物品,当前仓库里还有" + queue.size() + "件物品");
		        }
	    	}
	        
	    }
	    
	  
}
package com.spring.boot.entity;

import java.util.Queue;

public class Consumer implements Runnable{
		private Queue<Product> queue;
	    private int maxCapacity;
	    
	    /*表示当前线程共生产了多少件物品*/
	    private int count;

	    public Consumer(Queue<Product> queue, int maxCapacity) {
	        this.queue = queue;
	        this.maxCapacity = maxCapacity;
	    }
	    
	    
	    @Override
	    public void run() {
	    	while(true){
	    		synchronized (this) {
	    			//判断能否消费
		            while (queue.isEmpty()) {
		                try {
		                    System.out.println("消费者" + Thread.currentThread().getName() + "等待中... Queue 已缺货,无法消费");
		                    //等待生产者生产,消费者等待
		                    this.wait();
		                    System.out.println("消费者" + Thread.currentThread().getName() + "退出等待");
		                } catch (InterruptedException e) {
		                    e.printStackTrace();
		                }
		            }
		            //如果可以消费
		            Product product = queue.poll();
		            count++;
		            System.out.println("消费者:" + Thread.currentThread().getName() + " 共消费了:" + this.count + "件物品,当前仓库里还有" + queue.size() + "件物品");
		            //通知生产者生产
		            this.notifyAll();
		            
		        }
	    	}
	        
	    }
}
生产者:p1 共生产了:1件物品,当前仓库里还有1件物品
生产者:p1 共生产了:2件物品,当前仓库里还有2件物品
生产者:p1 共生产了:3件物品,当前仓库里还有3件物品
生产者:p1 共生产了:4件物品,当前仓库里还有4件物品
生产者:p1 共生产了:5件物品,当前仓库里还有5件物品
生产者:p1 共生产了:6件物品,当前仓库里还有6件物品
生产者:p1 共生产了:7件物品,当前仓库里还有7件物品
生产者:p1 共生产了:8件物品,当前仓库里还有8件物品
生产者:p1 共生产了:9件物品,当前仓库里还有9件物品
生产者:p1 共生产了:10件物品,当前仓库里还有10件物品
生产者:p1 共生产了:11件物品,当前仓库里还有11件物品
生产者:p1 共生产了:12件物品,当前仓库里还有12件物品
生产者:p1 共生产了:13件物品,当前仓库里还有13件物品
生产者:p1 共生产了:14件物品,当前仓库里还有14件物品
生产者:p1 共生产了:15件物品,当前仓库里还有15件物品
生产者:p1 共生产了:16件物品,当前仓库里还有16件物品
生产者:p1 共生产了:17件物品,当前仓库里还有17件物品
生产者:p1 共生产了:18件物品,当前仓库里还有18件物品
生产者:p1 共生产了:19件物品,当前仓库里还有19件物品
生产者:p1 共生产了:20件物品,当前仓库里还有21件物品
生产者:p2 共生产了:1件物品,当前仓库里还有20件物品
生产者:p1 共生产了:21件物品,当前仓库里还有22件物品
生产者:p2 共生产了:2件物品,当前仓库里还有23件物品
生产者:p1 共生产了:22件物品,当前仓库里还有24件物品
生产者:p2 共生产了:3件物品,当前仓库里还有25件物品
生产者:p1 共生产了:23件物品,当前仓库里还有26件物品
生产者:p1 共生产了:24件物品,当前仓库里还有28件物品
生产者:p1 共生产了:25件物品,当前仓库里还有28件物品
生产者:p2 共生产了:4件物品,当前仓库里还有27件物品
生产者:p1 共生产了:26件物品,当前仓库里还有28件物品
消费者:c1 共消费了:1件物品,当前仓库里还有27件物品
消费者:c2 共消费了:1件物品,当前仓库里还有28件物品
消费者:c1 共消费了:2件物品,当前仓库里还有29件物品
消费者:c1 共消费了:3件物品,当前仓库里还有27件物品
消费者:c1 共消费了:4件物品,当前仓库里还有26件物品
消费者:c1 共消费了:5件物品,当前仓库里还有25件物品
消费者:c1 共消费了:6件物品,当前仓库里还有24件物品
消费者:c1 共消费了:7件物品,当前仓库里还有23件物品
消费者:c1 共消费了:8件物品,当前仓库里还有22件物品
消费者:c1 共消费了:9件物品,当前仓库里还有21件物品
消费者:c1 共消费了:10件物品,当前仓库里还有20件物品
消费者:c1 共消费了:11件物品,当前仓库里还有19件物品
消费者:c1 共消费了:12件物品,当前仓库里还有18件物品
消费者:c1 共消费了:13件物品,当前仓库里还有17件物品
消费者:c1 共消费了:14件物品,当前仓库里还有16件物品
消费者:c1 共消费了:15件物品,当前仓库里还有15件物品
消费者:c1 共消费了:16件物品,当前仓库里还有14件物品
消费者:c1 共消费了:17件物品,当前仓库里还有13件物品
消费者:c1 共消费了:18件物品,当前仓库里还有12件物品
消费者:c1 共消费了:19件物品,当前仓库里还有11件物品
消费者:c1 共消费了:20件物品,当前仓库里还有10件物品
消费者:c1 共消费了:21件物品,当前仓库里还有9件物品
消费者:c1 共消费了:22件物品,当前仓库里还有8件物品
消费者:c1 共消费了:23件物品,当前仓库里还有7件物品
消费者:c1 共消费了:24件物品,当前仓库里还有6件物品
消费者:c1 共消费了:25件物品,当前仓库里还有5件物品
消费者:c1 共消费了:26件物品,当前仓库里还有4件物品
消费者:c1 共消费了:27件物品,当前仓库里还有3件物品
消费者:c1 共消费了:28件物品,当前仓库里还有2件物品
消费者:c1 共消费了:29件物品,当前仓库里还有1件物品
消费者:c1 共消费了:30件物品,当前仓库里还有0件物品
生产者:p1 共生产了:27件物品,当前仓库里还有30件物品
生产者:p1 共生产了:28件物品,当前仓库里还有1件物品
生产者:p1 共生产了:29件物品,当前仓库里还有2件物品
生产者:p1 共生产了:30件物品,当前仓库里还有3件物品
生产者:p1 共生产了:31件物品,当前仓库里还有4件物品
生产者:p1 共生产了:32件物品,当前仓库里还有5件物品
生产者:p1 共生产了:33件物品,当前仓库里还有6件物品
生产者:p1 共生产了:34件物品,当前仓库里还有7件物品
生产者:p1 共生产了:35件物品,当前仓库里还有8件物品
生产者:p1 共生产了:36件物品,当前仓库里还有9件物品
生产者:p1 共生产了:37件物品,当前仓库里还有10件物品
生产者:p1 共生产了:38件物品,当前仓库里还有11件物品
生产者:p1 共生产了:39件物品,当前仓库里还有12件物品
生产者:p1 共生产了:40件物品,当前仓库里还有13件物品
生产者:p1 共生产了:41件物品,当前仓库里还有14件物品
生产者:p1 共生产了:42件物品,当前仓库里还有15件物品
生产者:p1 共生产了:43件物品,当前仓库里还有16件物品
生产者:p2 共生产了:5件物品,当前仓库里还有29件物品
生产者:p2 共生产了:6件物品,当前仓库里还有18件物品
生产者:p2 共生产了:7件物品,当前仓库里还有19件物品
生产者:p2 共生产了:8件物品,当前仓库里还有20件物品
生产者:p2 共生产了:9件物品,当前仓库里还有21件物品
生产者:p2 共生产了:10件物品,当前仓库里还有22件物品
生产者:p2 共生产了:11件物品,当前仓库里还有23件物品
生产者:p2 共生产了:12件物品,当前仓库里还有24件物品
生产者:p2 共生产了:13件物品,当前仓库里还有25件物品
生产者:p2 共生产了:14件物品,当前仓库里还有26件物品
生产者:p2 共生产了:15件物品,当前仓库里还有27件物品
生产者:p2 共生产了:16件物品,当前仓库里还有28件物品
生产者:p2 共生产了:17件物品,当前仓库里还有29件物品
生产者:p2 共生产了:18件物品,当前仓库里还有30件物品
生产者:p2 共生产了:19件物品,当前仓库里还有31件物品
生产者:p2 共生产了:20件物品,当前仓库里还有32件物品
生产者:p2 共生产了:21件物品,当前仓库里还有33件物品
生产者:p2 共生产了:22件物品,当前仓库里还有34件物品
生产者:p2 共生产了:23件物品,当前仓库里还有35件物品
生产者:p2 共生产了:24件物品,当前仓库里还有36件物品
生产者:p2 共生产了:25件物品,当前仓库里还有37件物品
生产者:p2 共生产了:26件物品,当前仓库里还有38件物品
生产者:p2 共生产了:27件物品,当前仓库里还有39件物品
生产者:p2 共生产了:28件物品,当前仓库里还有40件物品
生产者:p2 共生产了:29件物品,当前仓库里还有41件物品
生产者:p2 共生产了:30件物品,当前仓库里还有42件物品
生产者:p2 共生产了:31件物品,当前仓库里还有43件物品
生产者:p2 共生产了:32件物品,当前仓库里还有44件物品
生产者:p2 共生产了:33件物品,当前仓库里还有45件物品
生产者:p2 共生产了:34件物品,当前仓库里还有46件物品
生产者:p2 共生产了:35件物品,当前仓库里还有47件物品
生产者:p2 共生产了:36件物品,当前仓库里还有48件物品
生产者:p2 共生产了:37件物品,当前仓库里还有49件物品
生产者:p2 共生产了:38件物品,当前仓库里还有50件物品
生产者:p2 共生产了:39件物品,当前仓库里还有51件物品
生产者:p2 共生产了:40件物品,当前仓库里还有52件物品
生产者:p2 共生产了:41件物品,当前仓库里还有53件物品
生产者:p2 共生产了:42件物品,当前仓库里还有54件物品
生产者:p2 共生产了:43件物品,当前仓库里还有55件物品
生产者:p2 共生产了:44件物品,当前仓库里还有56件物品
生产者:p2 共生产了:45件物品,当前仓库里还有57件物品
生产者:p2 共生产了:46件物品,当前仓库里还有58件物品
生产者:p2 共生产了:47件物品,当前仓库里还有59件物品
生产者:p2 共生产了:48件物品,当前仓库里还有60件物品
生产者:p2 共生产了:49件物品,当前仓库里还有61件物品
生产者:p2 共生产了:50件物品,当前仓库里还有62件物品
生产者:p2 共生产了:51件物品,当前仓库里还有63件物品
生产者:p2 共生产了:52件物品,当前仓库里还有64件物品
生产者:p2 共生产了:53件物品,当前仓库里还有65件物品
生产者:p2 共生产了:54件物品,当前仓库里还有66件物品
生产者:p2 共生产了:55件物品,当前仓库里还有67件物品
生产者:p2 共生产了:56件物品,当前仓库里还有68件物品
生产者:p2 共生产了:57件物品,当前仓库里还有69件物品
生产者:p2 共生产了:58件物品,当前仓库里还有70件物品
生产者:p2 共生产了:59件物品,当前仓库里还有71件物品
生产者:p2 共生产了:60件物品,当前仓库里还有72件物品
生产者:p2 共生产了:61件物品,当前仓库里还有73件物品
生产者:p2 共生产了:62件物品,当前仓库里还有74件物品
生产者:p2 共生产了:63件物品,当前仓库里还有75件物品
生产者:p2 共生产了:64件物品,当前仓库里还有76件物品
生产者:p2 共生产了:65件物品,当前仓库里还有77件物品
生产者:p2 共生产了:66件物品,当前仓库里还有78件物品
生产者:p2 共生产了:67件物品,当前仓库里还有79件物品
生产者:p2 共生产了:68件物品,当前仓库里还有80件物品
生产者:p2 共生产了:69件物品,当前仓库里还有81件物品
生产者:p2 共生产了:70件物品,当前仓库里还有82件物品
生产者:p2 共生产了:71件物品,当前仓库里还有83件物品
生产者:p2 共生产了:72件物品,当前仓库里还有84件物品
生产者:p2 共生产了:73件物品,当前仓库里还有85件物品
生产者:p2 共生产了:74件物品,当前仓库里还有86件物品
生产者:p2 共生产了:75件物品,当前仓库里还有87件物品
生产者:p2 共生产了:76件物品,当前仓库里还有88件物品
生产者:p2 共生产了:77件物品,当前仓库里还有89件物品
生产者:p2 共生产了:78件物品,当前仓库里还有90件物品
生产者:p2 共生产了:79件物品,当前仓库里还有91件物品
生产者:p2 共生产了:80件物品,当前仓库里还有92件物品
生产者:p2 共生产了:81件物品,当前仓库里还有93件物品
生产者:p2 共生产了:82件物品,当前仓库里还有94件物品
生产者:p2 共生产了:83件物品,当前仓库里还有95件物品
生产者:p2 共生产了:84件物品,当前仓库里还有96件物品
生产者:p2 共生产了:85件物品,当前仓库里还有97件物品
生产者:p2 共生产了:86件物品,当前仓库里还有98件物品
生产者:p2 共生产了:87件物品,当前仓库里还有99件物品
生产者:p2 共生产了:88件物品,当前仓库里还有100件物品
生产者p2等待中... Queue 已达到最大容量,无法生产
生产者:p1 共生产了:44件物品,当前仓库里还有17件物品
生产者p1等待中... Queue 已达到最大容量,无法生产
消费者c1等待中... Queue 已缺货,无法消费
消费者:c2 共消费了:2件物品,当前仓库里还有28件物品
消费者:c2 共消费了:3件物品,当前仓库里还有99件物品
消费者:c2 共消费了:4件物品,当前仓库里还有98件物品
消费者:c2 共消费了:5件物品,当前仓库里还有97件物品
消费者:c2 共消费了:6件物品,当前仓库里还有96件物品
消费者:c2 共消费了:7件物品,当前仓库里还有95件物品
消费者:c2 共消费了:8件物品,当前仓库里还有94件物品
消费者:c2 共消费了:9件物品,当前仓库里还有93件物品
消费者:c2 共消费了:10件物品,当前仓库里还有92件物品
消费者:c2 共消费了:11件物品,当前仓库里还有91件物品
消费者:c2 共消费了:12件物品,当前仓库里还有90件物品
消费者:c2 共消费了:13件物品,当前仓库里还有89件物品
消费者:c2 共消费了:14件物品,当前仓库里还有88件物品
消费者:c2 共消费了:15件物品,当前仓库里还有87件物品
消费者:c2 共消费了:16件物品,当前仓库里还有86件物品
消费者:c2 共消费了:17件物品,当前仓库里还有85件物品
消费者:c2 共消费了:18件物品,当前仓库里还有84件物品
消费者:c2 共消费了:19件物品,当前仓库里还有83件物品
消费者:c2 共消费了:20件物品,当前仓库里还有82件物品
消费者:c2 共消费了:21件物品,当前仓库里还有81件物品
消费者:c2 共消费了:22件物品,当前仓库里还有80件物品
消费者:c2 共消费了:23件物品,当前仓库里还有79件物品
消费者:c2 共消费了:24件物品,当前仓库里还有78件物品
消费者:c2 共消费了:25件物品,当前仓库里还有77件物品
消费者:c2 共消费了:26件物品,当前仓库里还有76件物品
消费者:c2 共消费了:27件物品,当前仓库里还有75件物品
消费者:c2 共消费了:28件物品,当前仓库里还有74件物品
消费者:c2 共消费了:29件物品,当前仓库里还有73件物品
消费者:c2 共消费了:30件物品,当前仓库里还有72件物品
消费者:c2 共消费了:31件物品,当前仓库里还有71件物品
消费者:c2 共消费了:32件物品,当前仓库里还有70件物品
消费者:c2 共消费了:33件物品,当前仓库里还有69件物品
消费者:c2 共消费了:34件物品,当前仓库里还有68件物品
消费者:c2 共消费了:35件物品,当前仓库里还有67件物品
消费者:c2 共消费了:36件物品,当前仓库里还有66件物品
消费者:c2 共消费了:37件物品,当前仓库里还有65件物品
消费者:c2 共消费了:38件物品,当前仓库里还有64件物品
消费者:c2 共消费了:39件物品,当前仓库里还有63件物品
消费者:c2 共消费了:40件物品,当前仓库里还有62件物品
消费者:c2 共消费了:41件物品,当前仓库里还有61件物品
消费者:c2 共消费了:42件物品,当前仓库里还有60件物品
消费者:c2 共消费了:43件物品,当前仓库里还有59件物品
消费者:c2 共消费了:44件物品,当前仓库里还有58件物品
消费者:c2 共消费了:45件物品,当前仓库里还有57件物品
消费者:c2 共消费了:46件物品,当前仓库里还有56件物品
消费者:c2 共消费了:47件物品,当前仓库里还有55件物品
消费者:c2 共消费了:48件物品,当前仓库里还有54件物品
消费者:c2 共消费了:49件物品,当前仓库里还有53件物品
消费者:c2 共消费了:50件物品,当前仓库里还有52件物品
消费者:c2 共消费了:51件物品,当前仓库里还有51件物品
消费者:c2 共消费了:52件物品,当前仓库里还有50件物品
消费者:c2 共消费了:53件物品,当前仓库里还有49件物品
消费者:c2 共消费了:54件物品,当前仓库里还有48件物品
消费者:c2 共消费了:55件物品,当前仓库里还有47件物品
消费者:c2 共消费了:56件物品,当前仓库里还有46件物品
消费者:c2 共消费了:57件物品,当前仓库里还有45件物品
消费者:c2 共消费了:58件物品,当前仓库里还有44件物品
消费者:c2 共消费了:59件物品,当前仓库里还有43件物品
消费者:c2 共消费了:60件物品,当前仓库里还有42件物品
消费者:c2 共消费了:61件物品,当前仓库里还有41件物品
消费者:c2 共消费了:62件物品,当前仓库里还有40件物品
消费者:c2 共消费了:63件物品,当前仓库里还有39件物品
消费者:c2 共消费了:64件物品,当前仓库里还有38件物品
消费者:c2 共消费了:65件物品,当前仓库里还有37件物品
消费者:c2 共消费了:66件物品,当前仓库里还有36件物品
消费者:c2 共消费了:67件物品,当前仓库里还有35件物品
消费者:c2 共消费了:68件物品,当前仓库里还有34件物品
消费者:c2 共消费了:69件物品,当前仓库里还有33件物品
消费者:c2 共消费了:70件物品,当前仓库里还有32件物品
消费者:c2 共消费了:71件物品,当前仓库里还有31件物品
消费者:c2 共消费了:72件物品,当前仓库里还有30件物品
消费者:c2 共消费了:73件物品,当前仓库里还有29件物品
消费者:c2 共消费了:74件物品,当前仓库里还有28件物品
消费者:c2 共消费了:75件物品,当前仓库里还有27件物品
消费者:c2 共消费了:76件物品,当前仓库里还有26件物品
消费者:c2 共消费了:77件物品,当前仓库里还有25件物品
消费者:c2 共消费了:78件物品,当前仓库里还有24件物品
消费者:c2 共消费了:79件物品,当前仓库里还有23件物品
消费者:c2 共消费了:80件物品,当前仓库里还有22件物品
消费者:c2 共消费了:81件物品,当前仓库里还有21件物品
消费者:c2 共消费了:82件物品,当前仓库里还有20件物品
消费者:c2 共消费了:83件物品,当前仓库里还有19件物品
消费者:c2 共消费了:84件物品,当前仓库里还有18件物品
消费者:c2 共消费了:85件物品,当前仓库里还有17件物品
消费者:c2 共消费了:86件物品,当前仓库里还有16件物品
消费者:c2 共消费了:87件物品,当前仓库里还有15件物品
消费者:c2 共消费了:88件物品,当前仓库里还有14件物品
消费者:c2 共消费了:89件物品,当前仓库里还有13件物品
消费者:c2 共消费了:90件物品,当前仓库里还有12件物品
消费者:c2 共消费了:91件物品,当前仓库里还有11件物品
消费者:c2 共消费了:92件物品,当前仓库里还有10件物品
消费者:c2 共消费了:93件物品,当前仓库里还有9件物品
消费者:c2 共消费了:94件物品,当前仓库里还有8件物品
消费者:c2 共消费了:95件物品,当前仓库里还有7件物品
消费者:c2 共消费了:96件物品,当前仓库里还有6件物品
消费者:c2 共消费了:97件物品,当前仓库里还有5件物品
消费者:c2 共消费了:98件物品,当前仓库里还有4件物品
消费者:c2 共消费了:99件物品,当前仓库里还有3件物品
消费者:c2 共消费了:100件物品,当前仓库里还有2件物品
消费者:c2 共消费了:101件物品,当前仓库里还有1件物品
消费者:c2 共消费了:102件物品,当前仓库里还有0件物品
消费者c2等待中... Queue 已缺货,无法消费

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值