1. 程式人生 > >Java多執行緒設計模式之執行緒池模式

Java多執行緒設計模式之執行緒池模式

前序:

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

  1,Request參與者(委託人),也就是訊息傳送端或者命令請求端

  2,Host參與者,接受訊息的請求,負責為每個訊息分配一個工作執行緒。

  3,Worker參與者,具體執行Request參與者的任務的執行緒,由Host參與者來啟動。

  由於常規呼叫一個方法後,必須等待該方法完全執行完畢後才能繼續執行下一步操作,而利用執行緒後,就不必等待具體任務執行完畢,就可以馬上返回繼續執行下一步操作。

  背景:

  由於在Thread-Per-Message Pattern中對於每一個請求都會生成啟動一個執行緒,而執行緒的啟動是很花費時間的工作,所以鑑於此,提出了Worker Thread,重複利用已經啟動的執行緒。

  執行緒池:

  Worker Thread,也稱為工人執行緒或背景執行緒,不過一般都稱為執行緒池。該模式主要在於,事先啟動一定數目的工作執行緒。當沒有請求工作的時候,所有的工人執行緒都會等待新的請求過來,一旦有工作到達,就馬上從執行緒池中喚醒某個執行緒來執行任務,執行完畢後繼續線上程池中等待任務池的工作請求的到達。

  任務池:主要是儲存接受請求的集合,利用它可以緩衝接受到的請求,可以設定大小來表示同時能夠接受最大請求數目。這個任務池主要是供執行緒池來訪問。

  執行緒池:這個是工作執行緒所在的集合,可以通過設定它的大小來提供併發處理的工作量。對於執行緒池的大小,可以事先生成一定數目的執行緒,根據實際情況來動態增加或者減少執行緒數目。執行緒池的大小不是越大越好,執行緒的切換也會耗時的。

  存放池的資料結構,可以用陣列也可以利用集合,在集合類中一般使用Vector,這個是執行緒安全的。

  Worker Thread的所有參與者:

  1,Client參與者,傳送Request的參與者

  2,Channel參與者,負責快取Request的請求,初始化啟動執行緒,分配工作執行緒

  3,Worker參與者,具體執行Request的工作執行緒

  4,Request參與者

  注意:將在Worker執行緒內部等待任務池非空的方式稱為正向等待。

  將在Channel執行緒提供Worker執行緒來判斷任務池非空的方式稱為反向等待。

  執行緒池例項1:

  利用同步方法來實現,使用陣列來作為任務池的存放資料結構。在Channel有快取請求方法和處理請求方法,利用生成者與消費者模式來處理儲存請求,利用反向等待來判斷任務池的非空狀態。

  Channel參與者:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 package whut.threadpool; //用到了生產者與消費者模式 //生成執行緒池,接受客戶端執行緒的請求,找到一個工作執行緒分配該客戶端請求 public class Channel { private static final int MAX_REQUEST = 100;// 併發數目,就是同時可以接受多少個客戶端請求 //利用陣列來存放請求,每次從陣列末尾新增請求,從開頭移除請求來處理 private final Request[] requestQueue;// 儲存接受客戶執行緒的數目 private int tail;//下一次存放Request的位置 private 

相關推薦

Java執行設計模式執行模式

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

java設計模式執行模式

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

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

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

java 單例模式執行安全的餓漢模式和懶漢模式

單例模式 解決的問題:保證一個類在記憶體中的物件唯一性. 比如:多程式讀取一個配置檔案時,建議配置檔案封裝成物件。會方便操作其中資料,又要保證多個程式讀到的是同一個配置檔案物件, 就需要該配置檔案物件在記憶體中是唯一的。 如何保證物件唯一性呢? 思想: 1,不讓其他程式建立

(三) Java執行詳解執行範圍內共享變數及ThreadLocal類使用

執行緒範圍內共享變數 HashTable方式實現 在開發中經常會遇到一種情況:有一個變數會被多個執行緒訪問,但是要確保同個執行緒內訪問的是同一個物件,Hashtable方式實現程式碼如下: public class ThreadExample5 {

設計模式】單例模式執行

好記性,不如爛筆頭。對於單例模式的理解和應用還是需要多多實踐,這次有感而發,寫份基於執行緒執行的單例模式。 單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部

JAVA執行設計4個執行,其中兩個執行每次對j增加1,另外兩個執行對j每次減少1。

最新在看一些執行緒方面的問題,也找一些題目來練手,看到一套題,JAVA設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒

Python 執行程序 (三) 執行程序對比、程序

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、多執行緒與多程序的對比 在之前簡單的提過,CPython中的GIL使得同一時刻只能有一個執行緒執行,即併

單列模式執行安全實現

單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜態內部類、列舉   懶漢式執行緒不安全 public class Singleton { private static Singleton instance; private Singleton (){} publ

執行——設計4個執行,其中兩個執行每次對j增加1,另外兩個執行對j每次減少1。寫出程式。

package com.com.aaa.addreduceThread; public class ThreadDemo { private int j=1; //每次新增1

【搞定Java併發程式設計】第27篇:Java中的併發工具類執行間交換資料的 Exchanger

上一篇:Java中的併發工具類之控制併發執行緒數的 Semaphore Exchanger(交換者)是一個用於執行緒間協作的工具類。Exchanger用於進行執行緒間的資料交換。它提供一個同步點,在這個同步點,兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchange方法交換資料,如果第一個

單例模式執行安全解析

面試的時候,常常會被問到這樣一個問題:請您寫出一個單例模式(Singleton Pattern)吧。     單例的目的是為了保證執行時Singleton類只有唯一的一個例項,最常用的地方比如拿到資料庫的連線,Spring的中建立BeanFactory這些開銷比較大的操作,

執行程式設計指南執行管理(iOS,Mac os )

1.執行緒成本 多執行緒會佔用記憶體和效能資源。 多執行緒另外一個需要考慮的成本是成產成本。設計一個執行緒應用有時候會需要根本性的改變你應用的資料結構的組織方式。要做這些改變可能需要避免使用同步,因為本身設計不好的應用可能會造成巨大的

作業系統精髓與設計原理執行

一、             執行緒間的狀態切換比程序間的狀態切換開銷更低的原因?(從資源分配角度來分析) 從下面這幅圖可以看出 左邊為單執行緒程序模型,右邊為多執行緒程序模型。從上圖可以看出,多執行緒雖然有自己的執行緒控制塊、使用者棧和核心棧,但是他們是共享同一個程序

執行(四)執行的同步執行安全問題

關於執行緒安全問題,有一個經典的問題:銀行取錢的問題。銀行取錢的基本流程可以分為如下幾個步驟: 1、使用者輸入賬號、密碼,系統判斷使用者的賬戶、密碼是否匹配; 2、使用者輸入取款金額; 3、系統判斷賬

java併發包學習系列:執行複用執行

什麼是執行緒池 頻繁使用new Thread來建立執行緒的方式並不太好。因為每次new Thread新建和銷燬物件效能較差,執行緒缺乏統一管理。好在Java提供了執行緒池,它能夠有效的管理、排程執行緒,避免過多的資源消耗。優點如下: 重用存在的執行緒,減少物

java併發程式設計(十)執行倒計數鎖存器CountDownLatch

一、定義一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。用給定的計數 初始化 CountDownLatch。由於呼叫了 countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的執行緒

Java--銀行存取款執行設計2(執行互斥)

同步:物件鎖的概念。如果多個執行緒共享某一個物件,作業系統會為每個物件用一個單詞生成一個鎖,鎖和物件一一對應。如果一個執行緒要對某個物件進行操作,必須拿到物件的鎖。 加鎖:同步語句或者同步方法(這裡用

《深入理解Java虛擬機器》學習筆記執行安全與鎖優化

二、執行緒安全 定義: “當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為都可以獲得

Java學習筆記——設計模式七.模板方法模式

tro mage emp java學習 java學習筆記 trac 子類 技術 primitive 模板方法模式(TemplateMethod),定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。