1. 程式人生 > >移動端併發程式設計基礎篇-阻塞佇列ArrayBlockingQueue&LinkedBlockingQueue

移動端併發程式設計基礎篇-阻塞佇列ArrayBlockingQueue&LinkedBlockingQueue

1.BlockingQueue和普通Queue的區別

  BlockingQueue阻塞佇列,多執行緒併發的上下文中,take,put,方法會發生阻塞狀態

  Queue 普通的Queue如果實現生產者,消費者的阻塞等待,需要自己實現Blocking狀態

2.ArrayBlockQueue&LinkedBlockQueue區別

  ArrayBlockQueue 陣列阻塞佇列,指定一個大小後無法擴容。put()方法中會檢測如果新增的元素會超出陣列範圍,在put()方法地方會blocking住,一直到該queue可以新增元素

  LinkedBlockQueue 連結串列阻塞佇列,不指定capacity可以無限制進行新增,put()方法不超過int.MaxVal不會發生阻塞

  相同點:

  陣列阻塞佇列和連結串列阻塞佇列,queue佇列為空的時候,再呼叫take方法會發生阻塞blocking狀態

3.ArrayBlockQueue full阻塞佇列滿的情況下測試例項

 private BlockingQueue<Integer> mQueue = new ArrayBlockingQueue<Integer>(8);

  for(int i = 0;i < 10;i++){
Thread thread = new Thread("threadName-" + i){
@Override
public void run() {
super.run();
int r = (int) (Math.random() * 100);
try {
System.out.println("tName-" + getName() + " putdata->" + r + " waiting...");
mQueue.put(r);
System.out.println("tName-" + getName() + " put succ -> " + r);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
}


try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}


Thread t = new Thread(){
@Override
public void run() {
super.run();
try {
Integer r = mQueue.take();
System.out.println("take data :" + r);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t.start();

發現倒數第二行列印地方,在take發生完畢後,被阻塞的66才會put成功

輸出結果:

tName-threadName-0 putdata->83 waiting...
tName-threadName-3 putdata->12 waiting...
tName-threadName-2 putdata->27 waiting...
tName-threadName-2 put succ -> 27
tName-threadName-0 put succ -> 83
tName-threadName-6 putdata->9 waiting...
tName-threadName-6 put succ -> 9
tName-threadName-4 putdata->12 waiting...
tName-threadName-4 put succ -> 12
tName-threadName-8 putdata->2 waiting...
tName-threadName-8 put succ -> 2
tName-threadName-1 putdata->24 waiting...
tName-threadName-1 put succ -> 24
tName-threadName-9 putdata->65 waiting...
tName-threadName-9 put succ -> 65
tName-threadName-5 putdata->66 waiting...
tName-threadName-3 put succ -> 12
tName-threadName-7 putdata->82 waiting...
take data :27
tName-threadName-5 put succ -> 66

4.ArrayBlockQueue empty 阻塞佇列空的情況下測試例項

private BlockingQueue<Integer> mQueue = new ArrayBlockingQueue<Integer>(8);

//put the data into the queue
for(int i = 0;i < 6;i++){
try {
mQueue.put(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

//
for(int i = 0;i < 12;i++){
Thread thread = new Thread("thread name-" + i){
@Override
public void run() {
super.run();
try {
System.out.println( getName() + " waiting for take...");
int r = mQueue.take();
System.out.println("tName-" + getName() + " take data->" + r);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
}

執行緒6,2,8一直都在阻塞waiting等待佇列充資料才進行

輸出結果:

thread name-0 waiting for take...
tName-thread name-0 take data->0
thread name-1 waiting for take...
thread name-11 waiting for take...
tName-thread name-11 take data->1
thread name-7 waiting for take...
thread name-9 waiting for take...
thread name-10 waiting for take...
tName-thread name-10 take data->5
thread name-4 waiting for take...
thread name-5 waiting for take...
thread name-3 waiting for take...
tName-thread name-9 take data->4
tName-thread name-1 take data->3
tName-thread name-7 take data->2
thread name-6 waiting for take...
thread name-2 waiting for take...
thread name-8 waiting for take...

5.LinkedBlockQueue full測試

  private BlockingQueue<Integer> mQueue = new LinkedBlockingQueue<Integer>();

  for(int i = 0;i < 100;i++){
Thread thread = new Thread("tName-" + i){
@Override
public void run() {
super.run();
int r = (int) (Math.random() * 50);
System.out.println("tName-" + getName() + " put " + r + " waiting for...");
try {
mQueue.put(r);
System.out.println("tName-" + " put " + r + " succ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
}

  for計數規模可擴大到1000,10000,100000

  一旦new LinkedBlockingQueue<Integer>(capacity); 指定容量大小後和ArrayBlockingQueue效果一致

6.LinkedBlockQueue empty測試例項

   private BlockingQueue<Integer> mQueue = new LinkedBlockingQueue<Integer>();

   //put data
for(int i = 0;i < 6;i++){
try {
mQueue.put(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

//take data
for(int i = 0;i < 8;i++){
Thread thread = new Thread("tName-" + i){
@Override
public void run() {
super.run();
try {
System.out.println("tName" + getName() + " take waiting...");
int r = mQueue.take();
System.out.println("tName" + getName() + " take r " + r + " succ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
}

輸出結果可以看出,執行緒5和執行緒6一直block狀態,沒有發生take succ的行為。 新增6個元素,8個執行緒從佇列獲取元素。有兩個執行緒會一直髮生阻塞狀態

輸出結果:

tNametName-0 take waiting...
tNametName-3 take waiting...
tNametName-3 take r 1 succ
tNametName-2 take waiting...
tNametName-1 take waiting...
tNametName-1 take r 3 succ
tNametName-2 take r 2 succ
tNametName-4 take waiting...
tNametName-4 take r 4 succ
tNametName-0 take r 0 succ
tNametName-7 take waiting...
tNametName-6 take waiting...
tNametName-5 take waiting...
tNametName-7 take r 5 succ

相關推薦

移動併發程式設計基礎-阻塞佇列ArrayBlockingQueue&LinkedBlockingQueue

1.BlockingQueue和普通Queue的區別   BlockingQueue阻塞佇列,多執行緒併發的上下文中,take,put,方法會發生阻塞狀態   Queue 普通的Queue如果實現生產者,消費者的阻塞等待,需要自己實現Blocking狀態 2.ArrayB

併發程式設計-concurrent指南-阻塞佇列BlockingQueue

阻塞佇列BlockingQueue,java.util.concurrent下的BlockingQueue介面表示一個執行緒放入和提取例項的佇列。 適用場景: BlockingQueue通常用於一個執行緒生產物件,而另一個執行緒消費物件的場景。 一個執行緒往裡面放,另一個執行緒從裡面取的一個Bloc

併發程式設計-concurrent指南-阻塞佇列-優先順序的阻塞佇列PriorityBlockingQueue

PriorityBlockingQueue是一個支援優先順序的無界阻塞佇列。 它使用了和類 java.util.PriorityQueue 一樣的排序規則。你無法向這個佇列中插入 null 值。 所有插入到 PriorityBlockingQueue 的元素必須實現 java.lang.Comparabl

泥瓦匠聊併發程式設計基礎:執行緒中斷和終止

1 執行緒中斷 1.1 什麼是執行緒中斷? 執行緒中斷是執行緒的標誌位屬性。而不是真正終止執行緒,和執行緒的狀態無關。執行緒中斷過程表示一個執行中的執行緒,通過其他執行緒呼叫了該執行緒的 interrupt() 方法,使得該執行緒中斷標誌位屬性改變。 深入思考下,執行緒中斷不是去中斷了執行緒,

併發程式設計 基礎

參考 : <<Java 併發程式設計的藝術>> -方騰飛 魏鵬 程曉明 無論是單機還是分散式環境,多執行緒無處不在, 如果用人來比作執行緒的話,一個公司不可能只有一個人,一個團隊不可能只有一個人 1.那麼多執行緒一定是快的嗎? 為

Java併發程式設計之LinkedBlockingDeque阻塞佇列詳解

簡介LinkedBlockingDeque是一個由連結串列結構組成的雙向阻塞佇列,即可以從佇列的兩端插入和移除元素。雙向佇列因為多了一個操作佇列的入口,在多執行緒同時入隊時,也就減少了一半的競爭。相比於其他阻塞佇列,LinkedBlockingDeque多了addFirst、

JAVA併發程式設計阻塞佇列-ArrayBlockingQueue

生活 有很多的不快樂,其實是源自不滿足,而不滿足,很多時候是源自於心不定,而心不定則是因為不清楚究竟自己要什麼,不清楚要什麼的結果就是什麼都想要,結果什麼都沒得到。 生產者消費者模式 生產者和消費者問題是執行緒模型中一個經典問題: 生產者和消費者在同一個時間段內共用一塊記憶體區域

python併發程式設計基礎之守護程序、佇列、鎖

併發程式設計2 1.守護程序 什麼是守護程序? 表示程序A守護程序B,當被守護程序B結束後,程序A也就結束。 from multiprocessing import Process import time ​ def task(): print('妃子的一生') time.s

併發程式設計基礎一)

併發程式設計——基礎部分(篇一)         這幾天在研究Java中的執行緒機制,結果越是看,反而感覺越是掌握的太少,變得多疑而又自信,因為Java執行緒機制教會我,“理論上是可靠的,實際是不準確的。”,一直向前走,越會發現精彩而又迷惑的地方,這就是Java中的執行緒機制這幾天所帶給我的一些東西,雖然只

移動-項目基礎總結------彭記(020)

易用 是不是 基於 性能優化 用戶體驗 family font tro 延遲 移動端的項目已經做過好幾個了,在這裏做個簡單的知識小總結 移動端常用類庫及優缺點1. jQuery Mobile 是 jQuery 發布的針對手機和平板設備、經過觸控優化的 Web 框架.它基於

移動“事件交互-遠程實戰開發課程”

問題 百分比 適配 ans 幻燈片 event 動畫 選項卡 滾動條 移動端“事件交互篇-遠程實戰開發課程” 1-移動端event相關問題2-touchEvent和滑屏3-滑屏的幻燈片(一)4-滑屏的幻燈片(二)5-移動端適配6-移動端布局註意事項7-音悅臺布局8-顯示隱藏

移動互動直播(入門)

adobe ext 版本 不錯 異步 構圖 原理 tex ref 本文來自網易雲社區前言本文為手機視頻直播開發新手,為了快速入門,利用強大google搜索引擎結合自身理解而整理的"視頻直播入門背景知識"。背景知識名詞解釋推流協議RTMPReal Time Messaging

併發程式設計基礎——執行緒狀態,啟動及停止的幾種方式

前言 遙想當年大二,實習面試的時候,面試官一個問題:作業系統最小的排程單元是什麼?當時還沒學過作業系統,只知道程序的概念,於是乎信心滿滿的答道,當然是程序啊,然後......就沒有然後了。 之後再看這個問題,其實就是一個笑話。作業系統排程的最小單元其實是執行緒。現在想想當時,自己大二就敢

併發程式設計基礎——JMM簡介

前言 這篇部落格嘗試針對JMM模型進行總結,並分析volatile和synchronized的一些原理(理解的並不深入) JMM記憶體模型 在談JMM記憶體模型的之前,得先了解JVM記憶體模型。 JVM記憶體模型 JVM在執行程式的時候將自動管理的記憶體劃分為幾個區域。從總體

Java併發程式設計(七)佇列同步器AQS

一、AQS簡介 佇列同步器AbstractQueuedSynchronizer(簡稱AQS)是用來構建鎖或其他同步元件的基礎框架,它服務的是鎖的實現者。AQS有一個變量表示同步狀態,通過內建的FIFO管理執行緒排隊,基於AQS可以將同步狀態管理、執行緒排隊、等待與喚醒等操作對鎖遮蔽,簡化鎖的實現

C/C++ 程式設計基礎之淺析堆&棧

C/C++ 程式設計基礎篇之淺析堆&棧(轉) 在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。 1、棧: 就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數,函式

併發-Java併發程式設計基礎

Java併發程式設計基礎 併發 在電腦科學中,併發是指將一個程式,演算法劃分為若干個邏輯組成部分,這些部分可以以任何順序進行執行,但與最終順序執行的結果一致。併發可以在多核作業系統上顯著的提高程式執行速度。 併發與並行聯絡與區別 這裡參考ErLang之父的解釋,ErLang之父談到了如何向一個5歲小孩解釋併發

Java網路程式設計基礎

一、前言 網路通訊在系統互動中是必不可少的一部分,無論是面試還是工作中都是繞不過去的一部分,本節我們來談談Java網路程式設計中的一些知識,本chat內容如下: 網路通訊基礎知識,剖析網路通訊的本質和需要注意的點 使用Java BIO阻塞套接字 實現簡單TCP

《Java併發程式設計的藝術》第4章 Java併發程式設計基礎

Java誕生時就選擇了內建對多執行緒的支援 作業系統執行一個程式時,會為其建立一個程序。 執行緒是作業系統排程的最小單元,都有各自的計數器、堆疊、區域性變數。能訪問共享的記憶體變數。CPU在他們上高速切換,讓人感覺在同步執行。 執行緒會被分到若干時間片,時間片用

Java語言程式設計基礎 day01

第1章 計算機程式和Java概述 1.1 什麼是計算機   計算機包括硬體(hardware)和軟體(software)兩部分,一般來說硬體包括計算機中可以看見的部分,而軟體提供看不見的指令,這些指令控制硬體並且使得硬體完成特定的任務。一臺計算機中央處理器