使用阻塞队列实现生产者和消费者问题

  BlockingQueue<E>接口定义了包括两个附加功能的队列。这两个功能是:如果从空队列中取元素或者向满队列中增加元素,则进入等待状态。BlockinQueue接口中的方法pu(e)t和take()可以使其进入无限阻塞状态,可以用这两个方法实现生产者和消费者问题,比较简单。

代码如下:

package com.lk.B;



import java.util.Random;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.LinkedBlockingQueue;



public class Test5 {

	private BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(2);

	private class Producer implements Runnable{



		@Override

		public void run() {

			// TODO Auto-generated method stub

			for(int i=0;i<5;i++){

				int b = new Random().nextInt(255);

				try {

					queue.put(b);

					System.out.println("向队列中加入"+b+"\t队列中有"+queue.size()+"个元素");

				} catch (InterruptedException e) {

					// TODO Auto-generated catch block

					e.printStackTrace();

				}

			}

		}

		

	}

	

	private class Consumer implements Runnable{



		@Override

		public void run() {

			try {

				Thread.sleep(100);

			} catch (InterruptedException e1) {

				// TODO Auto-generated catch block

				e1.printStackTrace();

			}

			// TODO Auto-generated method stub

			for(int i=0;i<5;i++){

				int b = 0;

				try {

					b=queue.take();

					System.out.println("从队列中取出"+b+"\t队列中有"+queue.size()+"个元素");

				} catch (InterruptedException e) {

					// TODO Auto-generated catch block

					e.printStackTrace();

				}

			}

		}

	}

	

	public static void main(String[] args) {

		Test5 test5 = new Test5();

		Producer producer = test5.new Producer();

		Consumer consumer = test5.new Consumer();

		new Thread(producer).start();

		new Thread(consumer).start();

	}

}

  运行结果:

/*

向队列中加入127	队列中有1个元素

向队列中加入113	队列中有2个元素

从队列中取出127	队列中有1个元素

向队列中加入88	        队列中有2个元素

从队列中取出113	队列中有1个元素

从队列中取出88	        队列中有0个元素

向队列中加入212	队列中有1个元素

从队列中取出212	队列中有0个元素

向队列中加入243	队列中有1个元素

从队列中取出243	队列中有0个元素

*/  

  

你可能感兴趣的:(阻塞队列)