Java阻塞队列BlockingQueue的使用

来源:互联网 发布:消防工程师网络培训班 编辑:程序博客网 时间:2024/05/20 07:15

使用阻塞队列BlockingQueue实现模拟生产消费关系:


import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;/** * 生产消费问题 * @author 周孟军时间:2016年8月2日 下午12:51:40  * */public class BlockingQueueDemo {/** * 定义装苹果的篮子 */class Basket {// 篮子 能够容纳3个苹果BlockingQueue<String> basket = new LinkedBlockingQueue<String>(3);// 生产苹果 -->放入篮子public void produce() throws InterruptedException {basket.put("1 apple");}// 消费苹果--->从篮子中取出public String consume() throws InterruptedException {// take方法 取出一个苹果 如果 bakset 为空 等到 有苹果为止 (获取并以处队列的头部)return basket.take();}}// 定义苹果的生产者 线程接口class Producer implements Runnable {private String instance;private Basket basket;public Producer(String instance, Basket basket) {super();this.instance = instance;this.basket = basket;}@Overridepublic void run() {try {while (true) {System.out.println("生产者准备生产苹果" + instance);basket.produce();System.out.println("生产者生产苹果完毕" + instance);// 休眠300MSThread.sleep(300);}} catch (InterruptedException e) {System.out.println("Producer InterruptedException");}}}class Consumer implements Runnable {private String instance;private Basket basket;public Consumer(String instance, Basket basket) {super();this.instance = instance;this.basket = basket;}@Overridepublic void run() {try {while (true) {// 消费苹果System.out.println("消费者注备消费苹果:" + instance);System.out.println(basket.consume());System.out.println("消费者消费苹果完毕" + instance);Thread.sleep(300);}} catch (Exception e) {System.out.println("Consumer InterruptedException");}}}public static void main(String[] args) {// 创建最外面的类BlockingQueueDemo test = new BlockingQueueDemo();// 篮子Basket basket = test.new Basket();// 生产者Producer producer1 = test.new Producer("生产者1", basket);Producer producer2 = test.new Producer("生产者2", basket);Consumer consumer = test.new Consumer("消费者1", basket);// 创建线程池ExecutorService service = Executors.newCachedThreadPool();service.submit(producer1);service.submit(producer2);service.submit(consumer);// 程序运行5秒后停止 所有任务try {Thread.sleep(5000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 结束所有 线程service.shutdownNow();}}



0 0
原创粉丝点击