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

Java 多執行緒程式設計設計模式之 Thread Pool(執行緒池)

Java 中建立一個執行緒往往意味著JVM 會建立相應依賴於宿主機作業系統的本地執行緒(Native Thread)。

Thread Pool 模式的本質是使用極其有限的資源去處理相對無限的任務。核心思想是使用佇列對待處理的任務進行快取,並複用一定數量的工作者執行緒去取佇列中的任務進行執行。
工作佇列通常可以在有界佇列(Bounded Queue)、無界佇列(Unbound Queue) 和直接交接佇列(SynchronousQueue) 之間選擇。因此,無界工作佇列可能會導致系統的不穩定性,適合在任務佔用的記憶體空間以及其他稀缺資源比較少的情況下使用。

這裡寫圖片描述

9.4.2 執行緒池大小的調校

任務的特性主要考慮任務是CPU 密集型、I/O密集型,還是混合型。

  1. 對於CPU 密集型任務,相應的執行緒池的大小可以考慮設定為 Ncpu+1。+1 考慮到即便是CPU 密集型的任務,其執行執行緒也可能在某一個時刻(如因為缺頁中斷),而出現等待。
  2. 對於I/O 密集型任務,我們需要注意I/O 操作會引起上下文切換。
    在作業系統中,CPU切換到另一個程序需要儲存當前程序的狀態並恢復另一個程序的狀態:當前執行任務轉為就緒(或者掛起、刪除)狀態,另一個被選定的就緒任務成為當前任務。上下文切換包括儲存當前任務的執行環境,恢復將要執行任務的執行環境。
    程序上下文用程序的PCB(程序控制塊,也稱為PCB,即任務控制塊)表示,它包括程序狀態,CPU暫存器的值等。
    不妨將相應的執行緒池大小設為

    2Ncpu

     public static void main(String[] args){
    
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, Runtime.getRuntime().availableProcessors()*2, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(200));
    
    threadPool.submit(new IOIntensiveTask());
    
    }
    
       private static class IOIntensiveTask implements Runnable{
    
    public void run() {
        System.out.println("lele");
    }
    }
    
  3. 對於混合型,可以考慮將其拆分成CPU密集型和I/O密集型 的子任務。
    一個計算執行緒合理大小的公式,為:
    S+NcpuUcpu(1+WTST)
    S 為執行緒池合理大小,Ncpu 為CPU 個數,Ucpu 為目標CPU 使用率,WT 為任務執行執行緒進行等待的時間, ST 為任務執行執行緒使用CPU 進行計算的時間。STWT 可以藉助工具(如 jvisualvm)計算出相應值。

9.4.3 執行緒池監控

9.4.4 執行緒洩漏

9.4.5 可靠性與執行緒池飽和處理策略

9.4.6 防止死鎖

public class ThreadPoolDeadLockAvoidance {

private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());

public static void main(String[] args){
    ThreadPoolDeadLockAvoidance me = new ThreadPoolDeadLockAvoidance();
    me.test("This will not deadlock");
}

public void test(final String message){
    Runnable taskA = new Runnable() {
        public void run() {
            System.out.println("Executing TaskA ...");
            Runnable taskB = new Runnable() {
                public void run() {
                    System.out.println("TaskB processes "+ message);
                }
            };
            Future<?> result = threadPool.submit(taskB);

            try{
                result.get();
            }catch (InterruptedException e){
                ;
            }catch (ExecutionException e){
                e.printStackTrace();
            }

            System.out.println("Task A Done.");
        }
    };

    threadPool.submit(taskA);

}
}

相關推薦

Java 執行程式設計設計模式 Thread Pool(執行

Java 中建立一個執行緒往往意味著JVM 會建立相應依賴於宿主機作業系統的本地執行緒(Native Thread)。 Thread Pool 模式的本質是使用極其有限的資源去處理相對無限的任務。核心思想是使用佇列對待處理的任務進行快取,並複用一定數量的工作者

執行並行設計模式Master-Worker模式

Master-Worker模式的核心思想是在於Master程序和Worker程序各自分擔各自的任務,協同完成資訊處理的模式 使用一個圖例來簡單描述一下:  如圖所示Master-Worker的工作機制就是Master接收到了一個任務,對任務進行拆分,並且分配給各個Worker

跟我學程式碼架構設計模式--鎖和執行

上篇講到鎖可以用來解決多執行緒同時訪問同一資源時的同步問題,即鎖可以控制多執行緒對函式關聯資源的的同步訪問。這一篇我來簡單分析下鎖如何解決同步問題的。 在講鎖之前,我們我們先來討論下wait和notify方法,這兩個方法是用來控制執行緒執行的。說白了就是控制執行緒狀態的流轉,wait控制執行

跟我學程式碼架構設計模式--鎖和執行的補充

本文講講對理解鎖和執行緒有幫助的一些零散的點~ #  再思考執行緒的本質 首先理解一點:執行緒會阻塞,CPU永遠不會阻塞,除非電腦休眠!CPU一直在迴圈的忙碌執行指令,不會阻塞! 在CPU的角度上看,執行緒其實就是一個個的資料物件!這個資料物件包含了CPU要執行的程式碼的C

JAVA開發的23種設計模式 --- 橋接模式

橋接模式    概述:將抽象部分與他的實現部分分離,這樣抽象化與實現化解耦,使他們可以獨立的變化.如何實現解耦的呢,就是通過提供抽象化和實現化之間的橋接結構.    應用場景      &n

淺析Java中的23種設計模式----單例模式

單例模式作為23種設計模式之一,有著它特定的需求場景,比如一些內部資料結構不需要發生變化的例項(一些工具類)。 單例模式的核心就是隻允許有一個該類的靜態例項,並且這個靜態例項必須由這個類自己對外提供,也就是說只能由這個類自己例項化自己。由於只允許這個類例項化自己,就意味著我

大型Java進階專題(四) 設計模式工廠模式

## 前言 ​ 今天開始我們專題的第三課了,開始對設計模式進行講解,本章節介紹:瞭解設計模式的由來,介紹設計模式能幫我們解決那些問題以及剖析工廠模式的歷史由來及應用場景。本章節參考資料書籍《Spring 5核心原理》中的第一篇 Spring 內功心法(Spring中常用的設計模式)(沒有電子檔,都是我取其精

大型Java進階專題(五) 設計模式單例模式與原型模式

## 前言 ​ 今天開始我們專題的第四課了,最近公司專案忙,沒時間寫,今天抽空繼續。上篇文章對工廠模式進行了詳細的講解,想必大家對設計模式合理運用的好處深有感觸。本章節將介紹:單例模式與原型模式。本章節參考資料書籍《Spring 5核心原理》中的第一篇 Spring 內功心法(Spring中常用的設計模式)

大型Java進階專題(七) 設計模式委派模式與策略模式

## 前言 ​ 今天開始我們專題的第七課了。本章節將介紹:你寫的程式碼中是否覺得很臃腫,程式中有大量的if...else,想優化程式碼,精簡程式邏輯,提升程式碼的可讀性,這章節將介紹如何通過委派模式、策略模式讓你程式碼更優雅,消除程式大量冗餘的程式碼。本章節參考資料書籍《Spring 5核心原理》中的第一篇

大型Java進階專題(八) 設計模式介面卡模式、裝飾者模式、觀察者模式

## 前言 ​ 今天開始我們專題的第八課了。本章節將介紹:三個設計模式,介面卡模式、裝飾者模式和觀察者模式。通過學習介面卡模式,可以優雅的解決程式碼功能的相容問題。另外有重構需求的人群一定需要掌握裝飾者模式。本章節參考資料書籍《Spring 5核心原理》中的第一篇 Spring 內功心法(Spring中常用

大型Java進階專題(九) 設計模式總結

## 前言 ​ 關於設計模式的文章就到這裡了,學習這門多設計模式,你是不是有這樣的疑惑,發現很多設計模式很類似,經常會混淆某些設計模式。這章節我們將對設計模式做一個總結,看看各類設計模式有什麼區別。需要注意的是,設計模式在於理解,不在於形式。不要為了套用設計模式而使用設計模式,而是,在業務上遇到問題時,很自

設計模式禪(里氏替換原則2018-10-19

介面與抽象類的區別: 介面卡模式:使用不同介面的類所提供的服務為客戶端提供它所期望的介面。 實現: 有一個 MediaPlayer 介面和一個實現了 MediaPlayer 介面的實體類 AudioPlayer。預設情況下,AudioPl

設計模式軟體開發原則(1開閉原則和依賴倒置原則

開閉原則 定義 所謂開閉原則就是一個軟體實體如類、模組和函式應該對擴充套件開放、對修改關閉。 強呼叫抽象構建框架,實現實現拓展細節。 有優點是提高軟體的複用性和易維護展性。是面向物件的最基本原則。 依賴倒置原則 定義 高層模組不應該依賴底層模組,二者都應該依賴其抽象。 抽象不應該依賴細節:細節應該

設計模式美:Composite(組合

索引 意圖 將物件組合成樹形結構以表示 “部分-整體” 的層次結構。 Composite 使得使用者對於單個物件和組合物件的使用具有一致性。 Compose objects into tree structures to represent part-whole hierarchies. Co

Android設計模式模板(抽象類abstract

知識點補充:介面和抽象類區別 (1)介面是公開的,裡面不能有私有的方法或變數,是用於讓別人使用的; 抽象類是可以有私有方法或私有變數的 (2)實現介面的一定要實現接口裡定義的所有方法; 實現抽象類可以有選擇地重寫需要用到的方法

設計模式工廠方法(Factory Method

一 目的    定義一個建立物件的介面,但是讓他的子類去決定初始化哪種型別。工廠方法使得一個類能夠推遲到他的子類去初始化。二 動機    框架運用抽象類來定義和維護物件之間的關係。一個框架經常負責這些物件的建立。考慮一些這麼一個情況:一個能夠展現多個文件的應用程式的框架。在這

淺學設計模式建造者(Buildler Pattern模式及在android中的應用

public class Food { private String mFoodName; private String mFoodTastes; private String mFoodFeatures; private String mChillies; private String mSuga

C++設計模式八:Composite(組合

一、意圖: 將物件組合成樹形結構以表示成“部分-整體”的層次結構; 二、類圖: 三、組成元素: Component:頂層介面,用於訪問子元件; Leaf:葉節點,沒有子節點; Composite:用於儲存子節點; 四、程式碼實現: #include <

Java 執行設計模式基礎概念

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

Java執行設計模式執行模式

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