1. 程式人生 > >(八) Java多執行緒詳解之阻塞佇列BlockingQueue及佇列優先順序詳解

(八) Java多執行緒詳解之阻塞佇列BlockingQueue及佇列優先順序詳解

阻塞佇列

阻塞佇列與普通佇列的區別在於當佇列是空時從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他的執行緒往空的佇列插入新的元素,同樣試圖往已滿的阻塞佇列中新增新元素的執行緒同樣也會被阻塞直到其他的執行緒使佇列重新變得空閒起來

BlockingQueue的操作方法

BlockingQueue的操作方法

BlockingQueue具有4組不同的方法用於插入移除以及對佇列中的元素進行檢查,如果請求的操作不能得到立即執行的話,每個方法的表現也不同。這些方法如下:

四組不同的行為方式解釋:

拋異常:如果試圖的操作無法立即執行,拋一個異常

特定值:如果試圖的操作無法立即執行,返回一個特定的值(常常是true
/false) 阻塞:如果試圖的操作無法立即執行,該方法呼叫將會發生阻塞,直到能夠執行 超時:如果試圖的操作無法立即執行,該方法呼叫將會發生阻塞直到能夠執行,但等待時間不會超過給定值。返回一個特定值以告知該操作是否成功(典型的是true/false)

BlockingQueue幾種子類實現

3.1 ArrayBlockingQueue:一個有界的阻塞佇列,其內部實現是將物件放到一個數組裡,有界也就意味著它不能夠儲存無限多數量的元素,它有一個同一時間能夠儲存元素數量的上限(因為它是基於陣列實現的,一旦初始化大小就無法修改)

3.2 DelayQueue:對元素進行持有直到一個特定的延遲到期,注入其中的元素必須實現java.util.concurrent.Delayed介面

3.3 LinkedBlockingQueue:內部以一個鏈式結構(連結節點)對其元素進行儲存,如果需要的話這一鏈式結構可以選擇一個上限,如果沒有定義上限將使用Integer.MAX_VALUE作為上限

3.4 PriorityBlockingQueue:一個無界的併發佇列,它使用了和類java.util.PriorityQueue一樣的排序規則,你無法向這個佇列中插入null值,所有插入到PriorityBlockingQueue的元素必須實現java.lang.Comparable介面。因此該佇列中元素的排序就取決於你自己的Comparable實現

3.5 SynchronousQueue:一個特殊的佇列,它的內部同時只能夠容納單個元素,如果該佇列已有一元素的話試圖向佇列中插入一個新元素的執行緒將會阻塞,直到另一個執行緒將該元素從佇列中抽走,同樣如果該佇列為空試圖向佇列中抽取一個元素的執行緒將會阻塞,直到另一個執行緒向佇列中插入了一條新的元素

優先順序佇列PriorityBlockingQueue

這裡詳細講一下PriorityBlockingQueue,因為在實際需求中可能會遇到希望後入隊的物件先出隊,面對這種需求我首先想到的是能不能在佇列指定位置新增元素來控制出隊的順序,遺憾佇列是線性結構只能在隊尾位置進行插入元素,隊頭位置插入元素,但是PriorityBlockingQueue可能通過實現Comparable介面來修改出隊優先順序。示例程式碼如下:

public class ThreadExample20 {
    public static void main(String[] args) {
        Comparator<Integer> comparator = new Comparator<Integer>() {
            public int compare(Integer param, Integer param2) {
                if (param > param2) {
                    return 1;
                } else if (param < param2) {
                    return -1;
                } else {
                    return 0;
                }
            }
        };

        BlockingQueue<Integer> blockingQueue = new PriorityBlockingQueue<>(5, comparator);

        try {
            blockingQueue.put(1);
            blockingQueue.put(23);
            blockingQueue.put(56);
            blockingQueue.put(15);
            blockingQueue.put(8);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        while (true) {
            try {
                System.out.println(blockingQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

程式執行結果:
1
8
15
23
56

相關推薦

java執行併發處理阻塞佇列LinkedBlockingQueue用法

<pre name="code" class="java">public class ThreadRelatedService2 { // key point: records list must be ordered public void

() Java執行阻塞佇列BlockingQueue佇列優先順序

阻塞佇列 阻塞佇列與普通佇列的區別在於當佇列是空時從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他的執行緒往空的佇列插入新的元素,同樣試圖往已滿的阻塞佇列中新增新元素的執

java執行學習():執行高階使用執行池的使用(非常推薦,涉及:ThreadPoolExecutor,Executors,ThreadPoolExecutor,ScheduledThreadP)

前言: 通過前面幾篇文章的學習,對多執行緒的知識瞭解了很多,同時也明白,其實學習不僅僅要看書,看文章,還要自己動手去敲demo,順便寫點文章收穫更多。當然多執行緒如果僅僅是用前面幾篇的知識的話,那未免也太膚淺了,畢竟,執行緒如果頻繁開啟和關閉的話,對系統資源的消耗那是相當大的。所以,

java執行系列翻譯java併發/執行教程

原文地址:http://tutorials.jenkov.com/java-concurrency/index.html 以前計算機都是單核,同時只能執行一個程式。之後出現了多重任務處理,這意味著計算機同時可以處理多個程式(又名任務或流程)。但這不是真正的“同時執行”,只是單個CPU被多個程式共

Java 執行設計模式基礎概念

順序、併發與並行 順序 用於表示多個操作“依次處理”。比如把十個操作交給一個人來處理時,這個人要一個一個地按順序來處理 並行 用於標識多個操作“同時處理”。比如十個操作分給兩個人處理時,這兩個人就會並行來處理。 併發 相對於順序和並行來說比較抽象,用於表示“將一個

java執行案例1簡單銀行取款問題及其優化

      之前學java的時候,學校老師由於課時問題,沒有教我們多執行緒,最近學校外聘的企業教師給我們做實訓要用到多執行緒,因此才初步瞭解多執行緒,以下這個案例只是介紹java程式碼優化,程式碼中有涉及多執行緒,但今天不對其講解,只簡單講解程式碼優化的問題,希望對初學者有幫

一、Java執行併發同步Semaphore

概念 Semaphore是一種在多執行緒環境下使用的設施,該設施負責協調各個執行緒,用來管理資源,以保證它們能夠正確、合理的使用公共資源的設施,也是作業系統中用於控制程序同步互斥的量。用我們常見的說法就是用來控制併發數。 訊號量是一個非負整數 。 業務場景 以售

java執行程式設計入門鎖的使用

package com.CUPK.lsz.TraditionalThread; //實現互斥的第一種方法:作為定義詞修飾程式碼 public class TraditonalThreadSynchronized1 { final Outputer outputer = new Outputer(

二、Java執行併發同步CyclicBarrier

概述 CyclicBarrier:可迴圈屏障,允許一組執行緒全部等待的同步輔助工具。一組執行緒互相等待,直到所有執行緒都到達某個公共屏障點(也可以叫同步點) 。它可以在等待執行緒之後重新使用。這個屏障之所以用迴圈修飾,是因為在所有的執行緒釋放彼此之後,這個屏障是

java執行併發系列閉鎖(Latch)和柵欄(CyclicBarrier)

-閉鎖(Latch) 閉鎖(Latch):一種同步方法,可以延遲執行緒的進度直到執行緒到達某個終點狀態。通俗的講就是,一個閉鎖相當於一扇大門,在大門開啟之前所有執行緒都被阻斷,一旦大門開啟所有執行緒都將通過,但是一旦大門開啟,所有執行緒都通過了,那麼這個閉鎖的狀態就失效了,門

Java執行設計模式執行池模式

前序:   Thread-Per-Message Pattern,是一種對於每個命令或請求,都分配一個執行緒,由這個執行緒執行工作。它將“委託訊息的一端”和“執行訊息的一端”用兩個不同的執行緒來實現。該執行緒模式主要包括三個部分:   1,Request參

java執行設計模式Guarded Suspension

想象一個場景,你在排隊領軍訓的裝備,當你排隊到視窗的時候,工作人員對你說,等一下,讓我叫後勤先去倉庫取下裝備再給你,於是你等到工作人員取回裝備才能領走裝備。 抽象為一個java程式模型:你是一個執行緒

java 執行平行計算矩陣乘法(星星筆記)

用java編寫兩個n階的方陣A和B的相乘程式,結果存放在方陣C中,其中使用Runnable介面實現矩陣的乘法。 方陣A和B的初始值如下:(同時開兩個執行緒) 輸出:c中所有元素之和、程式的執行時間 具體的程式如下: package com.xing.matrix; /

Java 執行設計模式Guarded Suspension

Guarded Suspension 模式核心是一個受保護的方法(Guarded Method)。該方法執行其所要真正執行的操作時需要滿足特定的條件(Predicate, 保護條件)。類似與 wait/notify, 當條件不滿足時,執行受保護的執行緒會被掛起進

java 執行併發系列 生產者消費者模式的兩種實現

生產者消費者模式是併發、多執行緒程式設計中經典的設計模式,生產者和消費者通過分離的執行工作解耦,簡化了開發模式,生產者和消費者可以以不同的速度生產和消費資料。真實世界中的生產者消費者模式生產者和消費者模式在生活當中隨處可見,它描述的是協調與協作的關係。比如一個人正在準備食物(

java執行與併發建立執行的幾種方式

1、繼承Thread類方法 public class Demo1 extends Thread{ @Override public void run() { //判斷標誌 while(true) { System.out.println(get

Java執行/併發26、阻塞佇列BlockingQueue

BlockingQueue介面定義了一種佇列,這種佇列通常容量是提前固定(確定了容量大小)的。容量滿時往BlockingQueue中新增資料時會造成阻塞,容量為空時取元素操作會阻塞。 我們可以認為BlockingQueue佇列是一個水庫。水庫滿了的時侯,上游的

java執行一 基本實現方法、消費者生產者佇列、死鎖

1.基本概念圖 四個狀態、start 代表被建立、run表示正在執行、阻塞(在幹別的事情去了,可以把資源空出來給別人用)、死亡。 核心思想是提高cpu的使用率,你幹別的事去了我來利用cpu啊,難點是同步,同時訪問資料,一個廁所只有一個坑,倆個人一起上是不

最全java執行總結3——瞭解阻塞佇列執行安全集合不

  看了前兩篇你肯定已經理解了 java 併發程式設計的低層構建。然而,在實際程式設計中,應該經可能的遠離低層結構,畢竟太底層的東西用起來是比較容易出錯的,特別是併發程式設計,既難以除錯,也難以發現問題,我們還是使用由併發處理的專業人員實現的較高層次的結構要方便、安全得多。 阻塞佇列   對於許多執行緒問題,

Java執行學習wait、notify/notifyAll

轉載 https://www.cnblogs.com/moongeek/p/7631447.html 1、wait()、notify/notifyAll() 方法是Object的本地final方法,無法被重寫。 2、wait()使當前執行緒阻塞,前提是 必須先獲