Java多執行緒-生產者消費者例子-使用阻塞佇列(BlockingQueue)實現
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* Created by wisgood .
*/
public class ProducerConsumerWithBlockingQueueDemo {
public static void main(String[] args) {
BlockingQueue<String> productFactory = new ArrayBlockingQueue(10);
new Thread(new ProducerWithBlockingQueue(productFactory), "1號生產者").start();
new Thread(new ConsumerWithBlockingQueue(productFactory), "1號消費者").start();
new Thread(new ConsumerWithBlockingQueue(productFactory), "2號消費者").start();
}
}
// 生產者
class ProducerWithBlockingQueue implements Runnable {
private BlockingQueue<String> productFactory;
public ProducerWithBlockingQueue( BlockingQueue<String> productFactory) {
this.productFactory = productFactory;
}
public void run() {
int i = 0;
while (true) {
try {
String product = String.valueOf(i) ;
//只有下面1行程式碼會互斥訪問productFactory
productFactory.put(product);
System.out.println("執行緒(" + Thread.currentThread().getName() + ")生產了一件產品:" + product + ";當前剩餘商品" + productFactory.size() + "個");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
}
}
// 消費者
class ConsumerWithBlockingQueue implements Runnable {
private BlockingQueue<String> productFactory;
public ConsumerWithBlockingQueue(BlockingQueue<String> productFactory) {
this.productFactory = productFactory;
}
public void run() {
while (true) {
try {
System.out.println("執行緒(" + Thread.currentThread().getName() + ")消費了一件產品:" + productFactory.take() + ";當前剩餘商品" + productFactory.size() + "個");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
輸出結果
執行緒(1號消費者)消費了一件產品:0;當前剩餘商品0個
執行緒(1號生產者)生產了一件產品:1;當前剩餘商品1個
執行緒(2號消費者)消費了一件產品:1;當前剩餘商品0個
執行緒(1號生產者)生產了一件產品:2;當前剩餘商品1個
執行緒(1號消費者)消費了一件產品:2;當前剩餘商品0個
執行緒(1號生產者)生產了一件產品:3;當前剩餘商品1個
執行緒(2號消費者)消費了一件產品:3;當前剩餘商品0個
執行緒(1號生產者)生產了一件產品:4;當前剩餘商品1個
執行緒(1號消費者)消費了一件產品:4;當前剩餘商品0個
執行緒(1號生產者)生產了一件產品:5;當前剩餘商品1個
執行緒(2號消費者)消費了一件產品:5;當前剩餘商品0個
執行緒(1號生產者)生產了一件產品:6;當前剩餘商品1個
執行緒(1號消費者)消費了一件產品:6;當前剩餘商品0個
文章為作者原創文章,如果對您有幫助,歡迎打賞!
相關推薦
Java多執行緒-生產者消費者例子-使用阻塞佇列(BlockingQueue)實現
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * Created by wisgood . */ public
Java多執行緒-生產者消費者模式
問題描述 有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定了一個具有n個緩衝區的緩衝池,生產者程序將它所產生的產品放入緩衝區中,消費者程序可以從一個緩衝區中取走產品去消費。儘管所有的生產者和消費
Java多執行緒——生產者消費者模型-演義
這裡主要解讀(亂侃)生產者消費者模型的工作方式以及JDK5.0新增實現和傳統同步關鍵字實現方式的區別。 在JDK5.0新增了Lock、Condition這兩個介面來處理多執行緒安全問題。 Lock:可替代synchronized實現的同步函式或同步程式碼塊。 Conditi
Java多執行緒生產者消費者說明等待喚醒機制問題和虛假喚醒問題
不用等待喚醒機制實現的生產者與消費者 程式碼 package com.hust.juc; /* * 生產者和消費者案例 */ public class TestProductorAndConsumer { public static vo
Java多執行緒之模擬一個阻塞佇列
import java.util.LinkedList; import java.util.concurrent.atomic.AtomicInteger; public class MyQueue { private final LinkedLi
java多執行緒併發處理之阻塞佇列LinkedBlockingQueue用法
<pre name="code" class="java">public class ThreadRelatedService2 { // key point: records list must be ordered public void
(八) Java多執行緒詳解之阻塞佇列BlockingQueue及佇列優先順序詳解
阻塞佇列 阻塞佇列與普通佇列的區別在於當佇列是空時從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他的執行緒往空的佇列插入新的元素,同樣試圖往已滿的阻塞佇列中新增新元素的執
Java多執行緒/併發26、阻塞佇列BlockingQueue
BlockingQueue介面定義了一種佇列,這種佇列通常容量是提前固定(確定了容量大小)的。容量滿時往BlockingQueue中新增資料時會造成阻塞,容量為空時取元素操作會阻塞。 我們可以認為BlockingQueue佇列是一個水庫。水庫滿了的時侯,上游的
最全java多執行緒總結3——瞭解阻塞佇列和執行緒安全集合不
看了前兩篇你肯定已經理解了 java 併發程式設計的低層構建。然而,在實際程式設計中,應該經可能的遠離低層結構,畢竟太底層的東西用起來是比較容易出錯的,特別是併發程式設計,既難以除錯,也難以發現問題,我們還是使用由併發處理的專業人員實現的較高層次的結構要方便、安全得多。 阻塞佇列 對於許多執行緒問題,
JAVA多執行緒和併發基礎面試問答(轉載)
多執行緒和併發問題是Java技術面試中面試官比較喜歡問的問題之一。在這裡,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java多執行緒基礎知識來對應日後碰到的問題。(校對注:非常贊同這個觀點) Java多執行緒面試問題 1. 程序和執行緒之間有什麼不同? 一個程序是一個獨立(
Java多執行緒知識點總結——進階篇(八) 之 等待喚醒機制 Lock 鎖升級版
JDK1.5 中提供了多執行緒升級解決方案。 將同步 Synchronized 替換成現實 Lock 操作。 將Object中的 wait、notify、notifyAll,替換成了C
java多執行緒與高併發庫應用(二)執行緒建立和定時任務Timer
1、建立執行緒的兩種方式, 通過start, 執行run方法。 第一種實現runnable, 定義類實現Runnable介面 重寫Runnable介面中的run方法 通過Thread建立執行緒物件 將Runnable介面的子類物件作為實際引數傳遞
Java多執行緒之JUC包:AbstractQueuedSynchronizer(AQS)原始碼學習筆記
若有不正之處請多多諒解,並歡迎批評指正。 請尊重作者勞動成果,轉載請標明原文連結: AbstractQueuedSynchronizer(AQS)是一個同步器框架,在實現鎖的時候,一般會實現一個繼承自AQS的內部類sync,作為我們的自定義同步器。AQS內部維護了一個state成員和一個佇列。其中
Java多執行緒知識點總結——進階篇(五)之多執行緒下的單例模式
餓漢式 餓漢式多執行緒和單執行緒的程式碼是一樣的,如下: class Single { private static final Single s = new Single(); p
JAVA多執行緒wait與notify詳細解析(由生產者和消費者案例引出)
生產者和消費者這個關係是個經典的多執行緒案例。現在我們編寫一個Demo來模擬生產者和消費者之間的關係。 假如有兩個類,一個是資料生產者類DataProvider,另一個是資料消費者類DataConsumer,這兩個類同時對資料類Data進行操作,生產者類負責生產資料,消費者類負責消費資料,下面是
Java多執行緒生產者與消費者等待喚醒機制(示例)
在下面新建的兩條執行緒,兩條執行緒操作的物件都是學生類,一條執行緒生產學生物件的資料,一條執行緒消費學生物件的資料,且做到,有資料才消費,沒資料就等待,沒資料就生產,有資料就等待。 第一個案例是學生類物件,非常的簡單就定義了兩個成員變數,以及一個用於喚醒執行緒的標記。 成員變數預設會賦值
java多執行緒-生產者與消費者模型(有限緩衝問題)
文章目錄 @[toc] 1.預備知識點 2.問題描述 3.java實現方式的預備知識 4.實現 1.預備知識點 執行緒同步 同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。“同
Java 多執行緒 生產者和消費者 佇列
wait()和notifyAll()方法以一種非常低階的方式解決了任務互操作問題,即每次互動時都握手。在許多情況下,你可以瞄向更高的抽象級別,使用同步佇列來解決任務協作問題,同步佇列在任何時刻都只允許一個任務插入或移除元素。在java.util.concurrent
Java多執行緒-生產者和消費者
標籤(空格分隔): java thread 簡介: 隨著作業系統的不斷更新迭代,多執行緒程式設計已經變的十分常見,java虛擬機器的多執行緒一般也是建立在作業系統本地native執行緒之上的,從而不必自己管理執行緒間的切換,直接交由本機作業系統進行排程和
java多執行緒之消費者生產者模式
/*@author shijin * 生產者與消費者模型中,要保證以下幾點: * 1 同一時間內只能有一個生產者生產 生產方法加鎖sychronized * 2 同一時間內只能有一個消費者消費 消費方法加鎖sychronized * 3 生產者生產的同時消費者不能消費