java concurrent系列2---BlockingQueue
2011-12-30 16:23
218 查看
BlockingQueue 阻塞队列,支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。
如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒。
如果BlockingQueue是满的任何试图往里存东西的操作也会被阻断进入等待状态, 直到BlockingQueue里有新的空间才会被唤醒继续操作。
如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒。
如果BlockingQueue是满的任何试图往里存东西的操作也会被阻断进入等待状态, 直到BlockingQueue里有新的空间才会被唤醒继续操作。
package concurrent; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class BlockingQueueTest { /** * 定义装苹果的篮子 */ public static class Basket { // 篮子,能够容纳3个苹果 BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3); // 生产苹果,放入篮子 public void produce(int i) throws InterruptedException { // put方法放入一个苹果,若basket满了,等到basket有位置再put basket.put("An apple "+i); System.out.println("生产者生产了苹果:" + i ); } // 消费苹果,从篮子中取走 public String consume() throws InterruptedException { // get方法取出一个苹果,若basket为空,等到basket有苹果为止 return basket.take(); } } // 测试方法 public static void testBasket() { // 建立一个装苹果的篮子 final Basket basket = new Basket(); // 定义苹果生产者 class Producer implements Runnable { int i=0; public void run() { try { while (true) { // 生产苹果 basket.produce(i); i++; // 休眠300ms Thread.sleep(300); } } catch (InterruptedException ex) { } } } // 定义苹果消费者 class Consumer implements Runnable { public void run() { try { while (true) { // 消费苹果 System.out.println("消费者消费苹果:" + basket.consume()); // 休眠1000ms Thread.sleep(1000); } } catch (InterruptedException ex) { } } } ExecutorService service = Executors.newCachedThreadPool(); Producer producer = new Producer(); Consumer consumer = new Consumer(); service.submit(producer);//若只将该句注释,basket队列一直是空,消费者在basket.take()处将一直等待 service.submit(consumer);//若只将该句注释,生产者生产3个苹果后,basket队列已满,生产者在basket.put("An apple "+i)处将一直等待 // 程序运行5s后,所有任务停止 try { Thread.sleep(5000); } catch (InterruptedException e) { } service.shutdownNow(); } public static void main(String[] args) { BlockingQueueTest.testBasket(); } }
相关文章推荐
- (译)Java Concurrent系列--BlockingQueue
- 《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分
- Java多线程系列--【JUC集合10】- ConcurrentLinkedQueue
- Java多线程工具包java.util.concurrent---LinkedBlockingQueue
- Java 线程安全:BlockingQueue(阻塞算法) VS ConcurrentLinkedQueue(非阻塞算法)
- java.util.concurrent系列文章--(6)网络服务的简单实践
- Java:concurrent包下面的Collection接口框架图( CopyOnWriteArraySet, CopyOnWriteArrayList,ConcurrentLinkedQueue,BlockingQueue)
- Java多线程系列之ConcurrentHashMap
- Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue
- java多线程学习-java.util.concurrent详解(四) BlockingQueue
- Java多线程系列-Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
- java多线程学习-java.util.concurrent详解(四) BlockingQueue
- Java多线程系列--“JUC集合”06之 ConcurrentSkipListSet
- java多线程学习-java.util.concurrent详解(四) BlockingQueue
- Java多线程系列十——BlockingQueue
- java多线程学习-java.util.concurrent详解(四) BlockingQueue
- 第六章 Java并发容器和框架(ConcurrentHashMap,ConcurrentLinkedQueue,BlockingQueue,Fork Join)
- java.util.concurrent 包笔记 --- BlockingQueue
- java多线程学习-java.util.concurrent详解(四) BlockingQueue