Java并發教程–阻塞隊列

如第3部分所述,Java 1.5中引入的線程池提供了核心支持,該支持很快成為許多Java開發人員的最愛。

在內部,這些實現巧妙地利用了Java 1.5中引入的另一種并發功能-阻塞隊列。

隊列

首先,簡要回顧一下什么是標準隊列。 在計算機科學中,隊列只是一個集合,始終將元素添加到末尾,并始終從頭開始獲取元素。 表達式先進先出(FIFO)通常用于描述標準隊列。 在Java 1.6中引入的是Deque或雙端隊列,該接口現在在LinkedList上實現。 Java中的某些隊列允許其他排序,例如使用Comparator甚至編寫自己的排序實現。 雖然擴展功能很好,但是我們今天關注的是BlockingQueues如何真正在并發開發中大放異彩。

阻塞隊列

阻塞隊列是一些隊列,它們還公開了在沒有可用元素的情況下阻止檢索元素的請求的功能,該附加選項可以限制等待時間。 在受限制的大小隊列上,嘗試添加時可以使用相同的阻止功能。 讓我們深入探討一下BlockingQueue用法的示例。

讓我們假設一個簡單的場景。 您有一個處理線程,其功能只是執行命令。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;private BlockingQueue<Command> workQueue = new LinkedBlockingQueue<Command>();public void addCommand(Command command) {workQueue.offer(command);
}public Object call() throws Exception {try {Command command = workQueue.take();command.execute();} catch (InterruptedException e) {throw new WorkException(e);}
}

當然,這是一個非常簡單的示例,但它向您展示了對多個線程使用BlockingQueue的基本知識。 讓我們嘗試一些更多的事情。 在此示例中,我們需要創建一個具有限制的連接池。 它僅應根據需要創建連接。 沒有客戶端將等待超過5秒的可用連接。

private BlockingQueue<Connection> pool = new ArrayBlockingQueue<Connection>(10);
private AtomicInteger connCount = new AtomicInteger();public Connection getConnection() {Connection conn = pool.poll(5, TimeUnit.SECONDS);if (conn == null) {synchronized (connCount) {if (connCount.get() < 10) {conn = getNewConnection();pool.offer(conn);connCount.incrementAndGet();}}if (conn == null) {throw new ConnUnavailException();} else {return conn;}}
}

最后,讓我們考慮一個有趣的實現示例示例SynchronousQueue

在此示例中,類似于我們的第一個示例,我們想要執行一個Command,但是需要知道它何時完成,最多等待2分鐘。

private BlockingQueue workQueue = new LinkedBlockingQueue();
private Map commandQueueMap = new ConcurrentHashMap(); public SynchronousQueue addCommand(Command command) {SynchronousQueue queue = new SynchronousQueue();commandQueueMap.put(command, queue);workQueue.offer(command);return queue;
}public Object call() throws Exception {try {Command command = workQueue.take();Result result = command.execute();SynchronousQueue queue = commandQueueMap.get(command);queue.offer(result);return null;} catch (InterruptedException e) {throw new WorkException(e);}
}

現在,使用者可以安全地輪詢其請求以執行其命令的超時。

Command command;
SynchronousQueue queue = commandRunner.addCommand(command);
Result result = queue.poll(2, TimeUnit.MINUTES);
if (result == null) {throw new CommandTooLongException(command);
} else {return result;
}

正如您開始看到的那樣,java中的BlockingQueues提供了很大的靈活性,并為您提供了相對簡單的結構來滿足多線程應用程序中的許多(如果不是全部)需求。 我們甚至沒有審查過一些非常整潔的BlockingQueues ,例如PriorityBlockingQueueDelayQueue 。 看看他們并取得聯系。 我們喜歡與開發人員交談。

參考: Carfey Software博客上的JCG合作伙伴的Java并發第5部分-阻塞隊列 。

相關文章 :
  • Java并發教程–信號量
  • Java并發教程–重入鎖
  • Java并發教程–線程池
  • Java并發教程–可調用,將來
  • Java并發教程– CountDownLatch
  • Exchanger和無GC的Java
  • Java Fork / Join進行并行編程
  • 使用迭代器時如何避免ConcurrentModificationException
  • 改善Java應用程序性能的快速技巧

翻譯自: https://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-blocking.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374072.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

json和字符串/數組/集合的互相轉換の神操作總結

一:前端字符串轉JSON的4種方式 1&#xff0c;eval方式解析&#xff0c;恐怕這是最早的解析方式了。 function strToJson(str){var json eval(( str ));return json; } 2&#xff0c;new Function形式&#xff0c;比較怪異哦。 function strToJson(str){var json (new Funct…

python 修改array_python 基礎_ 數組的 增刪改查3

數組是運用在多個數據存在一個變量中的&#xff0c;而在調用的時候可以調用所需要的數組。創建數組a [a,b,c,d,f]   #創建一個數組a其中有5個元素分別是abcdf1.查詢。所謂的查詢就是顯示變量a中一個或是一些元素print (a[1])  #打印出a變量中的序列1的元素&#xff0c;我們…

Android實現推送方式解決方案

Android實現推送方式解決方案 本文介紹在Android中實現推送方式的基礎知識及相關解決方案。推送功能在手機開發中應用的場景是越來起來了&#xff0c;不說別的&#xff0c;就我們手機上的新聞客戶端就時不j時的推送過來新的消息&#xff0c;很方便的閱讀最新的新聞信息。這種推…

NYOJ 2 括號配對問題

括號配對問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述 現在&#xff0c;有一行括號序列&#xff0c;請你檢查這行括號是否配對。 輸入第一行輸入一個數N&#xff08;0<N<100&#xff09;,表示有N組測試數據。后面的…

您應該對什么進行單元測試? –測試技術3

昨天我在辦公室里&#xff0c;和我的一位同事談論測試&#xff0c;他對編寫單元測試有些不服氣。 他使用的原因之一是有些測試似乎毫無意義&#xff0c;這使我想到了什么是單元測試&#xff0c;什么也不需要打擾。 考慮下面一個簡單的不可變的Name Bean&#xff0c;其中包含一…

java基礎知識系列---垃圾收集

1 為什么要使用垃圾回收機制&#xff1f; “垃圾收集”暗示程序不再需要的對象就是垃圾&#xff0c;可以被丟棄。更精確&#xff0c;更新的說法是“內存回收”。 1.1 新對象的使用 當一個對象不再被程序所引用時&#xff0c;他所使用的堆空間可以被回收&#xff0c;以便于被后續…

經濟

聯合國&#xff0c;美蘇英法中 國家要外匯儲備干什么&#xff1f; 01年加入WTO &#xff0c;美國躲開 WTO 另起爐灶 TPP 諾貝爾經濟學獎得主 克魯格蠻 觸動利益比觸動靈魂還困難 SDR IMF 轉載于:https://www.cnblogs.com/zrui513/p/5014593.html

wxpython的sizer_wxPython BoxSizer布局

Box wx.BoxSizer(wxHORIZONTAL) Box wx.BoxSizer(wxVERTICAL)Add() 方法(從wxSizer繼承)它附加到sizer的下一行/列。Box.Add(control, proportion, flag, border)proportion 參數控制的控件響應于所述容器的尺寸改變其大小。各種flag 參數的組合決定控件在sizer的外觀。下面是…

NYOJ 6 噴水裝置(一)

噴水裝置&#xff08;一&#xff09; 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3描述 現有一塊草坪&#xff0c;長為20米&#xff0c;寬為2米&#xff0c;要在橫中心線上放置半徑為Ri的噴水裝置&#xff0c;每個噴水裝置的效果都會讓以它為…

如何部署Zabbix服務端

部署環境 RHEL 6.7 Zabbix-server 2.2.14 安裝zabbix官方源 # wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm # rpm -ivh zabbix-release-2.2-1.el6.noarch.rpm 安裝zabbix-server # yum install zabbix zabbix-server-mysql zab…

Google App Engine上的Spring MVC和REST

前段時間&#xff0c;我寫了一篇關于如何使用Spring MVC實現Restful Web API的文章 。 閱讀我以前的文章以了解它。 在那篇文章中&#xff0c;開發了一個簡單的Rest示例。 為了測試該應用程序&#xff0c;將文件復制到Web服務器&#xff08;例如Tomcat &#xff09;中&#xff…

SALT+HASH撒鹽加密

#region 撒鹽加密string salt Guid.NewGuid().ToString();byte[] passwordAndSaltBytes System.Text.Encoding.UTF8.GetBytes(model.Password salt);byte[] hashBytes new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);string hashStr…

python 子串是否在字符串中_python七種方法判斷字符串是否包含子串

1. 使用 in 和 not inin 和 not in 在 Python 中是很常用的關鍵字&#xff0c;我們將它們歸類為 成員運算符。使用這兩個成員運算符&#xff0c;可以很讓我們很直觀清晰的判斷一個對象是否在另一個對象中&#xff0c;示例如下&#xff1a;>>> "llo" in &quo…

NYOJ 8 一種排序

一種排序 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述現在有很多長方形&#xff0c;每一個長方形都有一個編號&#xff0c;這個編號可以重復&#xff1b;還知道這個長方形的寬和長&#xff0c;編號、長、寬都是整數&#xff1b;現在要…

css3中的background

對background的兩種運用&#xff1a;一是background中的線性漸變&#xff0c;background: linear-gradient(to bottom,#0e7bef,#0d73da);這個是對背景顏色從上到下的一種線性漸變&#xff08;linear-gradient&#xff09;&#xff0c;兩個顏色參數是從第一個顏色參數漸變到第二…

Oracle JRockit Mission Control 4.1發布

Oracle發布了以前的僅JRockit專用工具Mission Control Suite&#xff08;JRMC&#xff09;的新版本。 4.1版本是次要版本升級&#xff0c;直接遵循4.0.1&#xff08;該版本發布于2010年中期&#xff09;。 但是&#xff0c;即使版本號表明是次要的升級&#xff0c;您仍然可以在…

pe安裝usb3.0驅動_電腦店U盤啟動盤制作工具下載安裝須知

電腦店U盤啟動盤制作工具集成最全面的硬件驅動&#xff0c;精心挑選的系統維護工具&#xff0c;加上獨有人性化的設計&#xff0c;具備較強的兼容性、穩定性和安全性。能夠完美兼容臺式機、品牌機及筆記本等新老機型&#xff0c;且安全無毒&#xff0c;電腦店一鍵U盤啟動盤制作…

Webwork【02】前端OGNL試練

1.OGNL 出現的意義 在mvc中&#xff0c;數據是在各個層次之間進行流轉是一個不爭的事實。而這種流轉&#xff0c;也就會面臨一些困境&#xff0c;這些困境&#xff0c;是由于數據在不同世界中的表現形式不同而造成的&#xff1a; a. 數據在頁面上是一個扁平的&#xff0c;不帶數…

python ATM購物程序

需求&#xff1a; 模擬實現一個ATM 購物商城程序 額度 15000或自定義實現購物商城&#xff0c;買東西加入 購物車&#xff0c;調用信用卡接口結賬可以提現&#xff0c;手續費5%每月22號出賬單&#xff0c;每月10號為還款日&#xff0c;過期未還&#xff0c;按欠款總額 萬分之5…

NYOJ 10 skiing

skiing 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;5描述Michael喜歡滑雪百這并不奇怪&#xff0c; 因為滑雪的確很刺激。可是為了獲得速度&#xff0c;滑的區域必須向下傾斜&#xff0c;而且當你滑到坡底&#xff0c;你不得不再次走上坡或…