<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《程序員修煉之道》-讀書筆記七-線程安全的Queue

      Java中有些多線程編程模式在很大程度上都依賴于Queue實現的線程安全性,所以很有必要充分認識它。

      隊列經常用來在線程之間傳遞工作單元,這個模式通常適合用Queue最簡單的并發擴展BlockingQueue來實現。

      1.BlockingQueue

      BlockingQueue還有兩個特性。

      • 在向隊列中put()時,如果隊列己滿,它會讓放人線程等待隊列騰出空間。
      • 在從隊列中take()時,如果隊列為空,會導致取出線程阻塞。

      BlockingQueue定義的常用方法如下:

        拋出異常 特殊值 阻塞  超時
      插入  add(e) offer(e)  put(e)  offer(e, time, unit)
      移除  remove() poll() take()  poll(time, unit)
      檢查  element() peek() 不可用 不可用

       

      2.一個冰激凌店的小例子

      顧客類

      /**
       * 顧客類
       */
      public class Customer {
      
          private String name;
      
          public Customer(String name) {
              this.name = name;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
      View Code

      冰激凌店類  

      /**
       * 冰激凌店以及測試方法
       */
      public class IceCreamShop extends Thread{
      
          /**
           * 等待購買冰激凌的隊伍
           */
          protected final BlockingQueue<Customer> queue;
      
          /**
           * 制作冰激凌的時間
           */
          protected final int restTime;
      
          /**
           * 故障標記
           */
          private boolean shutdown = false;
      
          public IceCreamShop(BlockingQueue queue, int restTime) {
              this.queue = queue;
              this.restTime = restTime;
          }
      
          @Override
          public void run() {
              while (!shutdown) {
                  try {
                      Thread.sleep(restTime);
                      Customer customer = queue.take();
                      System.out.println(customer.getName() + "已取餐-------------");
                  } catch (InterruptedException e) {
                      shutdown = true;
                  }
              }
          }
      
          public static void main(String[] args) {
              // 設置隊列中有三個顧客
              BlockingQueue<Customer> customers = new LinkedBlockingQueue<>();
              Customer customer1 = new Customer("zhangsan");
              Customer customer2 = new Customer("lisi");
              Customer customer3 = new Customer("ww");
              customers.add(customer1);
              customers.add(customer2);
              customers.add(customer3);
      
              IceCreamShop iceCreamShop = new IceCreamShop(customers, 1000);
              iceCreamShop.start();
          }
      }

      在IceCreamShop類的run()方法中,顧客需要先等待冰激凌店員制作冰激凌,然后再取餐,當沒有顧客后,店員會一直等待顧客,進入阻塞狀態。

      3. TransferQueue — Java7中的新貴

      Java7引人了TransferQueue。它本質上是多了一項transfer()操作的BlockingQueue。
      LinkedTransferQueue采用的一種預占模式。意思就是消費者線程取元素時,如果隊列為空,那就生成一個節點(節點元素為null)入隊,然后消費者線程被等待在這個節點上,后面生產者線程入隊時發現有一個元素為null的節點,生產者線程就不入隊了,直接就將元素填充到該節點,喚醒該節點等待的線程,被喚醒的消費者線程取走元素,從調用的方法返回。即找到匹配的節點不入隊,找不到根據how參數入隊。(簡單說就是 進一個,出一個)

      冰激凌店類

      import java.util.concurrent.TransferQueue;
      import java.util.concurrent.atomic.AtomicInteger;
      
      public abstract class IceCreamShop extends Thread{
      
          /**
           * 等待購買冰激凌的隊伍
           */
          protected final TransferQueue<Customer> queue;
      
          /**
           * 制作冰激凌的時間
           */
          protected final int restTime;
      
          /**
           * 顧客號
           */
          protected static AtomicInteger number = new AtomicInteger(1);
      
          /**
           * 故障標記
           */
          private boolean shutdown = false;
      
          public IceCreamShop(TransferQueue<Customer> queue, int restTime) {
              this.queue = queue;
              this.restTime = restTime;
          }
      
          @Override
          public void run() {
              while (!shutdown) {
                  try {
                      Thread.sleep(restTime);
                  } catch (InterruptedException e) {
                      shutdown = true;
                  }
                  doAction();
              }
          }
      
          public abstract void doAction();
      }

      測試方法類

      import java.util.concurrent.LinkedTransferQueue;
      import java.util.concurrent.TimeUnit;
      import java.util.concurrent.TransferQueue;
      
      public class IceCreamShopMain {
          public static void main(String[] args) {
      
              final TransferQueue<Customer> customers = new LinkedTransferQueue<Customer>();
      
              /**
               * 店員制作冰激凌
               */
              IceCreamShop t1 = new IceCreamShop(customers, 100) {
                  @Override
                  public void doAction() {
                      Customer customer = new Customer("顧客:" + number);
                      boolean handed = false;
                      try {
                          handed = customers.tryTransfer(customer, 100, TimeUnit.MILLISECONDS);
                      } catch (InterruptedException e) {
                      }
                      if (!handed) {
                          System.out.println("這個店員做的很快,趁著顧客取餐的時間,去吃了根薯條");
                      } else {
                          System.out.println(customer.getName() + "的冰激凌已制作完成---------請取餐");
                          number.getAndIncrement();
                      }
                  }
              };
      
              /**
               * 顧客取冰激凌
               */
              IceCreamShop t2 = new IceCreamShop(customers, 100) {
                  @Override
                  public void doAction() {
                      Customer customer = null;
                      try {
                          customer = customers.take();
                          Thread.sleep(900);
                          System.out.println(customer.getName() + "已取餐----------------");
                      } catch (InterruptedException e) {
                          return;
                      }
                  }
              };
      
              t1.start();
              t2.start();
          }
      }

       

       

       

      posted @ 2019-10-10 11:54  草莓罐頭  閱讀(189)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 黑人好猛厉害爽受不了好大撑| 成在人线av无码免费高潮水老板| 99re6在线视频精品免费下载| 日本高清视频网站www| 日韩免费美熟女中文av| 久久精品国产91精品亚洲| 精品国产迷系列在线观看| 亚洲欧洲av一区二区| 亚洲欧洲日产国无高清码图片| 亚洲精品一区国产精品| 亚洲成A人片在线观看无码不卡 | 国产成人av免费网址| 免费无码高H视频在线观看| 国产成人精品无人区一区| 老太脱裤让老头玩ⅹxxxx| 亚洲精品宾馆在线精品酒店| 国产亚洲精品综合99久久| 欧洲免费一区二区三区视频| 亚洲欧美日韩一区在线观看| 少妇人妻激情乱人伦| 日韩人妻无码一区二区三区99| 少妇人妻偷人精品免费视频| 国产乱码日产乱码精品精| 美女爽到高潮嗷嗷嗷叫免费网站| 国产中文三级全黄| 亚洲 小说区 图片区 都市| 亚洲一区二区三午夜福利| 欧洲码亚洲码的区别入口| 国产高清精品在线91| 亚洲五月天一区二区三区| 成人无码精品1区2区3区免费看| 亚洲超碰97无码中文字幕| 国产精品免费观看色悠悠| 色欲久久久天天天综合网精品| 久久国产精品精品国产色婷婷| 国产成人高清精品亚洲一区| 国产美女久久久亚洲综合| 人人澡人摸人人添| 国产边打电话边被躁视频| 亚洲产国偷v产偷v自拍色戒| 亚洲色婷婷综合开心网|