後端ing

spring-cache使用記錄

spring-cache的使用記錄,坑點記錄以及採用的解決方案

java

深刻分析 java 線程池的實現原理

在這篇文章中,做者有條不紊的將 java 線程池知識點的前因後果都介紹了一遍。

程序員

史上最全設計模式導學目錄

設計模式

面試

Java線程池、Executor原理分析

基於源碼,分析Java線程池實現。

正則表達式

java 線程池使用和詳解

java 線程池使用和詳解

算法

JS正則表達式完整教程(略長)

親愛的讀者朋友,若是你點開了這篇文章,說明你對正則很感興趣。 想必你也瞭解正則的重要性,在我看來正則表達式是衡量程序員水平的一個側面標準。 關於正則表達式的教程,網上也有不少,相信你也看了一些。 與之不一樣的是,本文的目的是但願全部認真讀完的童鞋們,都有實質性的提升。 本文內容共…

spring

Java 線程池藝術探索

文章一開始講了線程池的介紹和好處,而後分析了線程池中最核心的 ThreadPoolExecutor 類中構造器的七個參數的做用、類中兩個重要的方法,而後在對比研究了下 JDK 中自帶的四種線程池的用法和內部代碼細節,最後寫了一個自定義的線程池。

數據庫

Redis的併發控制

有關使用Redis對併發控制的實戰解決方案

設計模式

若是有人問你數據庫的原理,叫他看這篇文章

數據庫

數組

【我整理的 Java 開源項目】

  1. 整理出一些使用比較廣或者我的以爲比較好的java開源項目和資料供參考。
  2. 若是你以爲好可是我沒有列出的開源項目請告訴我,方便我添加到列表裏。
  3. 若是你發現信息描述有誤請聯繫我,我會及時修改或刪除。
  4. 文章裏面的內容會不斷進行變動和補充,後續除了會新增開源項目,…


學習依賴注入與控制反轉

學習依賴注入與控制反轉

多線程

JAVA回憶錄之泛型篇

泛型是JDK1.5版本中加入的,在沒有泛型以前,從集合中讀取到的每個對象都必須進行轉化。若是有有人不當心插入了類型錯誤的對象,在運行時的轉化處理就會出錯。有了泛型以後,能夠告訴變一塊兒每一個集合中接受那些對象類型。編譯器自動地爲你的插入進行轉化,並在編譯時告知是否插入了類型錯誤的對象。

從使用到原理學習 Java 線程池

關於 Java 線程池的使用,及原理分析, 分析角度新穎

線程池執行原則及參數詳解

本文介紹關於線程池的執行原則以及構造方法的參數詳解。

線程池的好處

引用自 http://ifeve.com/java-threadpool/ 的說明:

  • 下降資源消耗。經過重複利用已建立的線程下降線程建立和銷燬形成的消耗。
  • 提升響應速度。當任務到達時,任務能夠不須要的等到線程建立就能當即執行。
  • 提升線程的可管理性。線程是稀缺資源,若是無限制的建立,不只會消耗系統資源,還會下降系統的穩定性,使用線程池能夠進行統一的分配,調優和監控。

建立線程池

// 參數初始化

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
// 核心線程數量大小
private static final int corePoolSize = Math.max(2, Math.min(CPU_COUNT - 1, 4));
// 線程池最大容納線程數
private static final int maximumPoolSize = CPU_COUNT * 2 + 1;
// 線程空閒後的存活時長
private static final int keepAliveTime = 30;

// 任務過多後,存儲任務的一個阻塞隊列
BlockingQueue<Runnable>  workQueue = new SynchronousQueue<>();

// 建立線程的工廠
ThreadFactory threadFactory = new ThreadFactory() {
    private final AtomicInteger mCount = new AtomicInteger(1);

    public Thread newThread(Runnable r) {
        return new Thread(r, "AdvacnedAsyncTask #" + mCount.getAndIncrement());
    }
};

// 線程池任務滿載後採起的任務拒絕策略
RejectedExecutionHandler rejectHandler = new ThreadPoolExecutor.DiscardOldestPolicy();

// 線程池對象,建立線程
ThreadPoolExecutor mExecute = new ThreadPoolExecutor(
        corePoolSize, 
        maximumPoolSize,
        keepAliveTime,
        TimeUnit.SECONDS,
        workQueue,
        threadFactory, 
        rejectHandler
);

具體參數介紹

  • corePoolSize
線程池的核心線程數。在沒有設置 allowCoreThreadTimeOut 爲 true 的狀況下,核心線程會在線程池中一直存活,即便處於閒置狀態。
  • maximumPoolSize
線程池所能容納的最大線程數。當活動線程 (核心線程 + 非核心線程) 達到這個數值後,後續任務將會根據 RejectedExecutionHandler 來進行拒絕策略處理。
  • keepAliveTime
非核心線程 閒置時的超時時長。超過該時長,非核心線程就會被回收。若線程池經過 allowCoreThreadTimeOut() 方法設置 allowCoreThreadTimeOut 屬性爲 true,則該時長一樣會做用於核心線程,AsyncTask 配置的線程池就是這樣設置的。
  • unit
keepAliveTime 時長對應的單位。
  • workQueue
線程池中的任務隊列,經過線程池的 execute() 方法提交的 Runnable 對象會存儲在該隊列中。
  • ThreadFactory
線程工廠,功能很簡單,就是爲線程池提供建立新線程的功能。這是一個接口,能夠經過自定義,作一些自定義線程名的操做。
  • RejectedExecutionHandler
當任務沒法被執行時 (超過線程最大容量 maximum 而且 workQueue 已經被排滿了) 的處理策略,這裏有四種任務拒絕類型。

線程池工做原則

  • 一、當線程池中線程數量小於 corePoolSize 則建立線程,並處理請求。
  • 二、當線程池中線程數量大於等於 corePoolSize 時,則把請求放入 workQueue 中, 隨着線程池中的核心線程們不斷執行任務,只要線程池中有空閒的核心線程,線程池就從 workQueue 中取任務並處理。
  • 3 、當 taskQueue 已存滿,放不下新任務時則新建非核心線程入池,並處理請求直到線程數目達到 maximumPoolSize(最大線程數量設置值)。
  • 四、若是線程池中線程數大於 maximumPoolSize 則使用 RejectedExecutionHandler 來進行任務拒絕處理。

任務隊列 BlockingQueue

任務隊列 workQueue 是用於存放不能被及時處理掉的任務的一個隊列,它是
一個 BlockingQueue 類型。

關於 BlockingQueue,雖然它是 Queue 的子接口,可是它的主要做用並非容器,而是做爲線程同步的工具,他有一個特徵,當生產者試圖向 BlockingQueue 放入 (put) 元素,若是隊列已滿,則該線程被阻塞;當消費者試圖從 BlockingQueue 取出 (take) 元素,若是隊列已空,則該線程被阻塞。(From 瘋狂 Java 講義)

任務拒絕類型

  • ThreadPoolExecutor.AbortPolicy:
當線程池中的數量等於最大線程數時拋 java.util.concurrent.RejectedExecutionException 異常,涉及到該異常的任務也不會被執行,線程池默認的拒絕策略就是該策略。
  • ThreadPoolExecutor.DiscardPolicy():
當線程池中的數量等於最大線程數時, 默默丟棄不能執行的新加任務,不報任何異常。
  • ThreadPoolExecutor.CallerRunsPolicy():
當線程池中的數量等於最大線程數時,重試添加當前的任務;它會自動重複調用 execute()方法。
  • ThreadPoolExecutor.DiscardOldestPolicy():
當線程池中的數量等於最大線程數時, 拋棄線程池中工做隊列頭部的任務(即等待時間最久的任務),並執行新傳入的任務。

參考


ThreadPoolExecutor 核心實現原理和源碼解析

本文將詳細分析 ThreadPoolExecutor 的實現原理,並結合源碼介紹 ThreadPoolExecutor 的重要操做,對理解 ThreadPoolExecutor 很是有幫助。本文中源碼基於 JDK1.7

反射進階,編寫反射代碼值得注意的諸多細節

本文詳細解釋了運用反射進行代碼編寫時遭遇到的各類常見的 Exception,以及使用反射時須要注意的一些細節問題。

ThreadPoolExecutor線程池

ThreadPoolExecutor線程池

分析 Java 線程池執行原理

分析線程池源碼

JAVA中的靜態代理、動態代理以及CGLIB動態代理

代理模式是java中最經常使用的設計模式之一,尤爲是在spring框架中普遍應用。對於java的代理模式,通常可分爲:靜態代理、動態代理、以及CGLIB實現動態代理。對於上述三種代理模式,分別進行說明。

經典算法面試題 | 最少操做數使數組元素相等 I & II 大合集

專欄 | 九章算法 網址 | www.jiuzhang.com 最少操做數使數組元素相等 I 題目描述 給定一個長度爲n的非空整數數組,找出使數組全部元素均相等的最少操做數,其中一次操做將其中n-1個數加上1。 樣例 輸入: [1,2,3] 輸出: 3 說明: 最少3次操做到達…

hash算法原理詳解

主要是對hash算法中運用到的知識進行進一步的解析,幫助初學者進一步揭開hash算法的神祕面紗。

相關文章
相關標籤/搜索