使用BlockingQueue实现生产者消费者模式

package ProducerAndConsumer;

import java.util.Iterator;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 队列(Queue)是一个先进先出的数据机构
 * 1,BlockingQueue 是 Queue的子接口。拥有Queue和Collection接口的所有方法。除此之外,BlockingQueue提供了操作阻塞队列的方法。
 * 2,BlockingQueue提供了可阻塞的put和take方法,以及支持定时的offer和poll方法。如果队列已经满了,那么put方法将阻塞到有空间可用;如果队列为空,那么take方法将会阻塞到有元素可用。
 * 队列可以是有界的,也可以是无界的,无界队列永远不会充满,因此无界队列的put方法永远也不会阻塞。
 * 3,BlockingQueue常用有两个实现类,分别是ArrayBlockingQueue和LinkedBlockingQueue,ArrayBlockingQueue必须在创建时指定容量。
 * LinkedBlockingQueue 可以不用指定容量,如果不指定,默认为无限容量(Integer.MAX_VALUE)
 * 4,参考链接:https://www.cnblogs.com/qlqwjy/p/10175201.html,感谢作者
 */
public class BlockingQueueTest {

	//生产者是否生产结束标志
	static boolean endFalg=false;
	public static void main(String[] args) {
		f1();
	}
	
	static void f1(){
		//必须初始化队列容量,最多两个只能存两个元素
		final BlockingQueue arrayQueue=new ArrayBlockingQueue<>(2);
		//arrayQueue=new LinkedBlockingQueue<>(12);
		
		//消费者线程
		Thread consumer1=new Thread(()-> {
			try {
				//如果生产者没有生产结束,就一直循环取值
				while(!BlockingQueueTest.endFalg){
					Thread.sleep(100);
					//如果队列为空,则该方法阻塞,直到队列中有元素为止
					String element=arrayQueue.take();
					System.out.println(Thread.currentThread().getName()+"消费的产品是:"+element);
				}
			} catch (InterruptedException e) {
				
			}

	     },"消费者1");
		
		//生产者者线程
		Thread producer1=new Thread(()-> {
			try {
				for (int i = 0; i < 10; i++) {
					Thread.sleep(50);
					//如果超过队列容量,则该方法阻塞,直到队列中元素个数小于队列容量
					arrayQueue.put(i+"号产品");
					System.out.println(Thread.currentThread().getName()+"生产的产品是:"+i+"号产品");
			     }
				//生产者生产结束,修改标记
				BlockingQueueTest.endFalg=true;
			} catch (InterruptedException e) {
				
			}

	     },"生产者1");
		
		consumer1.start();
		producer1.start();
	}
}

运行结果:
 

生产者1生产的产品是:0号产品
生产者1生产的产品是:1号产品
消费者1消费的产品是:0号产品
生产者1生产的产品是:2号产品
消费者1消费的产品是:1号产品
生产者1生产的产品是:3号产品
消费者1消费的产品是:2号产品
生产者1生产的产品是:4号产品
消费者1消费的产品是:3号产品
生产者1生产的产品是:5号产品
消费者1消费的产品是:4号产品
生产者1生产的产品是:6号产品
消费者1消费的产品是:5号产品
生产者1生产的产品是:7号产品
消费者1消费的产品是:6号产品
生产者1生产的产品是:8号产品
消费者1消费的产品是:7号产品
生产者1生产的产品是:9号产品
消费者1消费的产品是:8号产品

 

你可能感兴趣的:(java)