zoukankan      html  css  js  c++  java
  • java阻塞队列

      1 package com.faramita.test.mianshi;
      2 
      3 import java.util.concurrent.ArrayBlockingQueue;
      4 import java.util.concurrent.BlockingQueue;
      5 import java.util.concurrent.ExecutorService;
      6 import java.util.concurrent.Executors;
      7 
      8 /**
      9 
     10  本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.
     11 
     12  本例再次实现11.4线程----条件Condition中介绍的篮子程序,不过这个篮子中最多能放的苹果数不是1,可以随意指定.当篮子满时,生产者进入等待状态,当篮子空时,消费者等待.
     13 
     14  */
     15 
     16 /**
     17  * 使用BlockingQueue的关键技术点如下: 1.BlockingQueue定义的常用方法如下:
     18  * 1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则招聘异常
     19  * 2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,
     20  * 则返回true,否则返回false.
     21  * 3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,
     22  * 则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
     23  * 4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
     24  * 5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
     25  * 2.BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类
     26  * 1)ArrayBlockingQueue:规定大小的BlockingQueue
     27  * ,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.
     28  * 2)LinkedBlockingQueue:大小不定的BlockingQueue
     29  * ,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制
     30  * ,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的
     31  * 3)PriorityBlockingQueue
     32  * :类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.
     33  * 4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.
     34  * 3.LinkedBlockingQueue和ArrayBlockingQueue比较起来
     35  * ,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue
     36  * ,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue.
     37  */
     38 
     39 public class BlockingQueueTest
     40 {
     41     /** 定义装苹果的篮子 */
     42     public static class Basket
     43     {
     44         // 篮子,能够容纳3个苹果  
     45         BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
     46         // 生产苹果,放入篮子  
     47         public void produce() throws InterruptedException
     48         {
     49             // put方法放入一个苹果,若basket满了,等到basket有位置  
     50             basket.put("An apple");
     51         }
     52 
     53         // 消费苹果,从篮子中取走  
     54         public String consume() throws InterruptedException
     55         {
     56             // take方法取出一个苹果,若basket为空,等到basket有苹果为止  
     57             return basket.take();
     58         }
     59     }
     60 
     61     // 测试方法  
     62     public static void testBasket()
     63     {
     64         final Basket basket = new Basket();// 建立一个装苹果的篮子  
     65         // 定义苹果生产者  
     66         class Producer implements Runnable
     67         {
     68             public void run()
     69             {
     70                 try
     71                 {
     72                     while (true)
     73                     {
     74                         // 生产苹果  
     75                         System.out.println("生产者准备生产苹果: " + System.currentTimeMillis());
     76                         basket.produce();
     77                         System.out.println("生产者生产苹果完毕: " + System.currentTimeMillis());
     78                         // 休眠300ms  
     79                         Thread.sleep(300);
     80                     }
     81                 }
     82                 catch (InterruptedException ex)
     83                 {
     84                 }
     85             }
     86         }
     87 
     88         // 定义苹果消费者  
     89         class Consumer implements Runnable
     90         {
     91             public void run()
     92             {
     93                 try
     94                 {
     95                     while (true)
     96                     {
     97                         // 消费苹果  
     98                         System.out.println("消费者准备消费苹果: " + System.currentTimeMillis());
     99                         basket.consume();
    100                         System.out.println("消费者消费苹果完毕: " + System.currentTimeMillis());
    101                         // 休眠1000ms  
    102                         Thread.sleep(1000);
    103                     }
    104                 }
    105                 catch (InterruptedException ex)
    106                 {
    107                 }
    108             }
    109         }
    110 
    111         ExecutorService service = Executors.newCachedThreadPool();
    112         Producer producer = new Producer();
    113         Consumer consumer = new Consumer();
    114         service.submit(producer);
    115         service.submit(consumer);
    116 
    117         // 程序运行5s后,所有任务停止  
    118         try
    119         {
    120             Thread.sleep(5000);
    121         }
    122         catch (InterruptedException ex)
    123         {
    124         }
    125         service.shutdownNow();
    126     }
    127 
    128     public static void main(String[] args)
    129     {
    130         BlockingQueueTest.testBasket();
    131     }
    132 }
  • 相关阅读:
    Postman使用教程
    CAD和ArcGIS转换 矢量配准
    SAP CRM Advanced search和Simple search里Max hit表现行为的差异
    SAP CRM Product simple search的启用步骤
    如何快速定位SAP CRM订单应用(Order Application)错误消息抛出的准确位置
    如何动态修改SAP CRM WebClient UI表格栏的宽度
    如何在SAP CRM WebClient UI里创建web service并使用ABAP消费
    如何处理SAP CRM Web Service错误
    如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
    如何开启SAP CRM基于WORD模板创建附件的功能
  • 原文地址:https://www.cnblogs.com/ios9/p/7473312.html
Copyright © 2011-2022 走看看