摘要:生產(chǎn)者消費者模式是一個經(jīng)典的多線程設計模式,它為多線程的協(xié)作提供了良好的解決方案。生產(chǎn)者消費者模式中的內(nèi)存緩沖區(qū)的主要功能是數(shù)據(jù)在多線程間的共享。
生產(chǎn)者-消費者模式是一個經(jīng)典的多線程設計模式,它為多線程的協(xié)作提供了良好的解決方案。在生產(chǎn)者-消費者模式中,通常有兩類線程,即若干個生產(chǎn)者線程和若干個消費者線程。生產(chǎn)者線程負責提交用戶請求,消費者線程負責處理用戶請求。生產(chǎn)者和消費者之間通過共享內(nèi)存緩沖區(qū)進行通信。
生產(chǎn)者-消費者模式中的內(nèi)存緩沖區(qū)的主要功能是數(shù)據(jù)在多線程間的共享。
1.創(chuàng)建一個被消費的對象
public final class Data{ private String id; private String name; //getter/setter(),toString()省略,構造方法省略 }
2.創(chuàng)建一個生產(chǎn)者
public class Provider implements Runnable{ //共享緩存區(qū) private BlockingQueue queue; //多線程間是否啟動變量,有強制從主內(nèi)存中刷新的功能。即時返回線程的狀態(tài) private volatile boolean isRunning = true; //id生成器 private static AtomicInteger count = new AtomicInteger(); //隨機對象 private static Random r = new Random(); public Provider(BlockingQueue queue){ this.queue = queue; } @Override public void run() { while(isRunning){ try { //隨機休眠0 - 1000 毫秒 表示獲取數(shù)據(jù)(產(chǎn)生數(shù)據(jù)的耗時) Thread.sleep(r.nextInt(1000)); //獲取的數(shù)據(jù)進行累計... int id = count.incrementAndGet(); //比如通過一個getData方法獲取了 Data data = new Data(Integer.toString(id), "數(shù)據(jù)" + id); System.out.println("當前線程:" + Thread.currentThread().getName() + ", 獲取了數(shù)據(jù),id為:" + id + ", 進行裝載到公共緩沖區(qū)中..."); if(!this.queue.offer(data, 2, TimeUnit.SECONDS)){ System.out.println("提交緩沖區(qū)數(shù)據(jù)失敗...."); //do something... 比如重新提交 } } catch (InterruptedException e) { e.printStackTrace(); } } } public void stop(){ this.isRunning = false; } }
3.添加一個消費者
public class Consumer implements Runnable{ private BlockingQueue queue; public Consumer(BlockingQueue queue){ this.queue = queue; } //隨機對象 private static Random r = new Random(); @Override public void run() { while(true){ try { //獲取數(shù)據(jù) Data data = this.queue.take(); //進行數(shù)據(jù)處理。休眠0 - 1000毫秒模擬耗時 Thread.sleep(r.nextInt(1000)); System.out.println("當前消費線程:" + Thread.currentThread().getName() + ", 消費成功,消費數(shù)據(jù)為id: " + data.getId()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
4.定義一個測試類
public class Main{ public static void main(String[] args) throws Exception { //內(nèi)存緩沖區(qū) BlockingQueue queue = new LinkedBlockingQueue(10); //生產(chǎn)者 Provider p1 = new Provider(queue); Provider p2 = new Provider(queue); Provider p3 = new Provider(queue); //消費者 Consumer c1 = new Consumer(queue); Consumer c2 = new Consumer(queue); Consumer c3 = new Consumer(queue); //創(chuàng)建線程池運行,這是一個緩存的線程池,可以創(chuàng)建無窮大的線程, //沒有任務的時候不創(chuàng)建線程。空閑線程存活時間為60s(默認值) ExecutorService cachePool = Executors.newCachedThreadPool(); cachePool.execute(p1); cachePool.execute(p2); cachePool.execute(p3); cachePool.execute(c1); cachePool.execute(c2); cachePool.execute(c3); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } p1.stop(); p2.stop(); p3.stop(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // cachePool.shutdown(); // cachePool.shutdownNow(); } }
運行結(jié)果如下所示
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70455.html
摘要:模式是常用的并行計算模式,它的核心思想是系統(tǒng)是由兩類進程協(xié)助工作。負責接收和分配任務,負責處理子任務。當各個子進程處理完成后,會返回結(jié)果給,由做歸納和總結(jié)。其好處是能將一個大任務分解成若干個小任務,并行執(zhí)行,從而提高系統(tǒng)的吞吐量。 Master-worker模式是常用的并行計算模式,它的核心思想是系統(tǒng)是由兩類進程協(xié)助工作。Master負責接收和分配任務,worker負責處理子任務。當各...
摘要:模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務在包中接口是線程模式的實現(xiàn),可以來進行異步計算。 Future模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務在java.util.concurrent包中.Future接口是Java線程Future模式的實現(xiàn),可以來進行異步計算。 showImg(https://segmentfault.com/img/...
摘要:導讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關注一下。目錄一基礎篇二進階篇三高級篇四架構篇五擴 導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...
摘要:程序執(zhí)行時,至少會有一個線程在運行,這個運行的線程被稱為主線程。程序的終止是指除守護線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個時間點執(zhí)行的處理只有一個。 Java 程序執(zhí)行時,至少會有一個線程在運行...
摘要:并發(fā)與并行并發(fā)與并行的概念并行多個實例或者多臺機器同時執(zhí)行一段處理邏輯,是真正的同時。并發(fā)通過調(diào)度算法,讓用戶看上去同時執(zhí)行,實際上從操作層面不是真正的同時。并行與并發(fā)的異同點相似性都是為了合理且最大化利用系統(tǒng)的資源。 并發(fā)(concurrency)與并行(parallellism) 并發(fā)與并行的概念 ??并行:多個cpu實例或者多臺機器同時執(zhí)行一段處理邏輯,是真正的同時。 ...
閱讀 1519·2021-11-23 09:51
閱讀 3639·2021-09-26 09:46
閱讀 2125·2021-09-22 10:02
閱讀 1818·2019-08-30 15:56
閱讀 3319·2019-08-30 12:51
閱讀 2224·2019-08-30 11:12
閱讀 2060·2019-08-29 13:23
閱讀 2323·2019-08-29 13:16