欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用阻塞隊列控制線程通信的方法實例詳解

 更新時間:2019年09月17日 11:51:10   作者:cakincqm  
這篇文章主要介紹了Java使用阻塞隊列控制線程通信的方法,結(jié)合實例形式詳細分析了java使用阻塞隊列控制線程通信的相關原理、方法及操作注意事項,需要的朋友可以參考下

本文實例講述了Java使用阻塞隊列控制線程通信的方法。分享給大家供大家參考,具體如下:

一 點睛

阻塞隊列主要用在生產(chǎn)者/消費者的場景,下面這幅圖展示了一個線程生產(chǎn)、一個線程消費的場景:

負責生產(chǎn)的線程不斷的制造新對象并插入到阻塞隊列中,直到達到這個隊列的上限值。隊列達到上限值之后生產(chǎn)線程將會被阻塞,直到消費的線程對這個隊列進行消費。同理,負責消費的線程不斷的從隊列中消費對象,直到這個隊列為空,當隊列為空時,消費線程將會被阻塞,除非隊列中有新的對象被插入。

BlockingQueue的核心方法:

方法\行為

拋異常 

特定的值

阻塞

超時

插入方法

add(o)

offer(o) 

put(o) 

offer(o, timeout, timeunit)

移除方法

 

poll(),remove(o)

take()

 poll(timeout, timeunit)

獲取、不刪除元素

element()

peek()     

 

 

行為解釋:

1.拋異常:如果操作不能馬上進行,則拋出異常。

2. 特定的值:如果操作不能馬上進行,將會返回一個特殊的值,一般是true或者false。

3. 阻塞:如果操作不能馬上進行,操作會被阻塞。

4. 超時:如果操作不能馬上進行,操作會被阻塞指定的時間,如果指定時間沒執(zhí)行,則返回一個特殊值,一般是true或者false。

插入方法:

  • add(E e) : 添加成功返回true,失敗拋IllegalStateException異常。
  • offer(E e) : 成功返回 true,如果此隊列已滿,則返回 false。
  • put(E e) :將元素插入此隊列的尾部,如果該隊列已滿,則一直阻塞。

刪除方法:

  • remove(Object o) :移除指定元素,成功返回true,失敗返回false。
  • poll() : 獲取并移除此隊列的頭元素,若隊列為空,則返回 null。
  • take():獲取并移除此隊列頭元素,若沒有元素則一直阻塞。

獲取、不刪除元素:

  • element() :獲取但不移除此隊列的頭元素,沒有元素則拋異常。
  • peek() :獲取但不移除此隊列的頭;若隊列為空,則返回 null。

二 實戰(zhàn)1

1 代碼

import java.util.concurrent.*;
public class BlockingQueueTest
{
   public static void main(String[] args)
      throws Exception
   {
      // 定義一個長度為2的阻塞隊列
      BlockingQueue<String> bq = new ArrayBlockingQueue<>(2);
      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同
      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同
      System.out.println("打印1");
      bq.put("Java"); // ① 阻塞線程。
      System.out.println("打印2");
   }
}

2 運行

打印1

三 實戰(zhàn)2

1 代碼

import java.util.concurrent.*;
public class BlockingQueueTest
{
   public static void main(String[] args)
      throws Exception
   {
      // 定義一個長度為2的阻塞隊列
      BlockingQueue<String> bq = new ArrayBlockingQueue<>(2);
      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同
      bq.put("Java"); // 與bq.add("Java"、bq.offer("Java")相同
      System.out.println("打印1");
      //bq.put("Java"); // ① 阻塞線程。
      System.out.println("打印2");
   }
}

2 運行

打印1
打印2

四 實戰(zhàn)3

1 代碼

import java.util.concurrent.*;
class Producer extends Thread
{
   private BlockingQueue<String> bq;
   public Producer(BlockingQueue<String> bq)
   {
      this.bq = bq;
   }
   public void run()
   {
      String[] strArr = new String[]
      {
        "Java",
        "Struts",
        "Spring"
      };
      for (int i = 0 ; i < 5 ; i++ )
      {
        System.out.println(getName() + "生產(chǎn)者準備生產(chǎn)集合元素!");
        try
        {
           Thread.sleep(200);
           // 嘗試放入元素,如果隊列已滿,線程被阻塞
           bq.put(strArr[i % 3]);
        }
        catch (Exception ex){ex.printStackTrace();}
        System.out.println(getName() + "生產(chǎn)完成:" + bq);
      }
   }
}
class Consumer extends Thread
{
   private BlockingQueue<String> bq;
   public Consumer(BlockingQueue<String> bq)
   {
      this.bq = bq;
   }
   public void run()
   {
      while(true)
      {
        System.out.println(getName() + "消費者準備消費集合元素!");
        try
        {
           Thread.sleep(200);
           // 嘗試取出元素,如果隊列已空,線程被阻塞
           bq.take();
        }
        catch (Exception ex){ex.printStackTrace();}
        System.out.println(getName() + "消費完成:" + bq);
      }
   }
}
public class BlockingQueueTest2
{
   public static void main(String[] args)
   {
      // 創(chuàng)建一個容量為1的BlockingQueue
      BlockingQueue<String> bq = new ArrayBlockingQueue<>(1);
      // 啟動3條生產(chǎn)者線程
      new Producer(bq).start();
      new Producer(bq).start();
      new Producer(bq).start();
      // 啟動一條消費者線程
      new Consumer(bq).start();
   }
}

2 運行

Thread-1生產(chǎn)者準備生產(chǎn)集合元素!
Thread-2生產(chǎn)者準備生產(chǎn)集合元素!
Thread-0生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費者準備消費集合元素!
Thread-0生產(chǎn)完成:[Java]
Thread-0生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[]
Thread-2生產(chǎn)完成:[Java]
Thread-2生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費者準備消費集合元素!
Thread-3消費完成:[Struts]
Thread-3消費者準備消費集合元素!
Thread-2生產(chǎn)完成:[Struts]
Thread-2生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[]
Thread-0生產(chǎn)完成:[Struts]
Thread-3消費者準備消費集合元素!
Thread-0生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[Java]
Thread-3消費者準備消費集合元素!
Thread-1生產(chǎn)完成:[Java]
Thread-1生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[]
Thread-2生產(chǎn)完成:[Spring]
Thread-2生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費者準備消費集合元素!
Thread-3消費完成:[Java]
Thread-3消費者準備消費集合元素!
Thread-2生產(chǎn)完成:[Java]
Thread-2生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[]
Thread-1生產(chǎn)完成:[Struts]
Thread-3消費者準備消費集合元素!
Thread-1生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[Spring]
Thread-3消費者準備消費集合元素!
Thread-1生產(chǎn)完成:[Spring]
Thread-1生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[]
Thread-3消費者準備消費集合元素!
Thread-2生產(chǎn)完成:[Struts]
Thread-3消費完成:[]
Thread-0生產(chǎn)完成:[Spring]
Thread-0生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費者準備消費集合元素!
Thread-1生產(chǎn)完成:[Java]
Thread-1生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費完成:[Java]
Thread-3消費者準備消費集合元素!
Thread-3消費完成:[]
Thread-0生產(chǎn)完成:[Java]
Thread-0生產(chǎn)者準備生產(chǎn)集合元素!
Thread-3消費者準備消費集合元素!
Thread-3消費完成:[]
Thread-3消費者準備消費集合元素!
Thread-0生產(chǎn)完成:[Struts]
Thread-3消費完成:[]
Thread-3消費者準備消費集合元素!
Thread-1生產(chǎn)完成:[Struts]
Thread-3消費完成:[]
Thread-3消費者準備消費集合元素!

更多java相關內(nèi)容感興趣的讀者可查看本站專題:《Java進程與線程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • SpringMVC?RESTFul實戰(zhàn)案例訪問首頁

    SpringMVC?RESTFul實戰(zhàn)案例訪問首頁

    這篇文章主要為大家介紹了SpringMVC?RESTFul實戰(zhàn)案例訪問首頁,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • JavaWeb實現(xiàn)簡單用戶發(fā)送郵件

    JavaWeb實現(xiàn)簡單用戶發(fā)送郵件

    這篇文章主要為大家詳細介紹了JavaWeb實現(xiàn)簡單用戶發(fā)送郵件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 阿里Druid數(shù)據(jù)連接池引發(fā)的線上異常解決

    阿里Druid數(shù)據(jù)連接池引發(fā)的線上異常解決

    這篇文章主要為大家介紹了一次關于阿里Druid數(shù)據(jù)連接池引發(fā)的線上異常問題的解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • SpringSecurity微服務實戰(zhàn)之公共模塊詳解

    SpringSecurity微服務實戰(zhàn)之公共模塊詳解

    這篇文章主要為大家介紹了SpringSecurity微服務實戰(zhàn)之公共模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 實例詳解Java實現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換

    實例詳解Java實現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換

    這篇文章主要介紹了Java實現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換實例代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2016-12-12
  • java常用API介紹之包裝類

    java常用API介紹之包裝類

    這篇文章主要介紹了java常用API介紹之包裝類,API,即Application Programming Interface,中文名稱是“應用程序接口",這些接口就是"jdk所提供"給我們使用的類,需要的朋友可以參考下
    2023-04-04
  • 解決JDK異常處理No appropriate protocol問題

    解決JDK異常處理No appropriate protocol問題

    這篇文章主要介紹了解決JDK異常處理No appropriate protocol問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • SpringBoot電腦商城項目刪除收貨地址的實現(xiàn)方法

    SpringBoot電腦商城項目刪除收貨地址的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot項目--電腦商城刪除收貨地址功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • java多線程開發(fā)之通過對戰(zhàn)游戲?qū)W習CyclicBarrier

    java多線程開發(fā)之通過對戰(zhàn)游戲?qū)W習CyclicBarrier

    這篇文章給大家分享了關于java多線程開發(fā)中通過對戰(zhàn)游戲?qū)W習CyclicBarrier的相關知識點內(nèi)容,有興趣的朋友們學習參考下。
    2018-08-08
  • Java中的DecimalFormat用法解析

    Java中的DecimalFormat用法解析

    這篇文章主要介紹了Java中的DecimalFormat用法解析,DecimalFormat是Java中用于格式化數(shù)字的類,它提供了一種簡單而靈活的方式來格式化數(shù)字,包括指定小數(shù)位數(shù)、千位分隔符、貨幣符號等,需要的朋友可以參考下
    2023-10-10

最新評論