spring-cache的使用記錄,坑點記錄以及採用的解決方案
java
在這篇文章中,做者有條不紊的將 java 線程池知識點的前因後果都介紹了一遍。
程序員
設計模式
面試
基於源碼,分析Java線程池實現。
正則表達式
java 線程池使用和詳解
算法
親愛的讀者朋友,若是你點開了這篇文章,說明你對正則很感興趣。 想必你也瞭解正則的重要性,在我看來正則表達式是衡量程序員水平的一個側面標準。 關於正則表達式的教程,網上也有不少,相信你也看了一些。 與之不一樣的是,本文的目的是但願全部認真讀完的童鞋們,都有實質性的提升。 本文內容共…
spring
文章一開始講了線程池的介紹和好處,而後分析了線程池中最核心的 ThreadPoolExecutor 類中構造器的七個參數的做用、類中兩個重要的方法,而後在對比研究了下 JDK 中自帶的四種線程池的用法和內部代碼細節,最後寫了一個自定義的線程池。
數據庫
有關使用Redis對併發控制的實戰解決方案
設計模式
數據庫
數組
學習依賴注入與控制反轉
多線程
泛型是JDK1.5版本中加入的,在沒有泛型以前,從集合中讀取到的每個對象都必須進行轉化。若是有有人不當心插入了類型錯誤的對象,在運行時的轉化處理就會出錯。有了泛型以後,能夠告訴變一塊兒每一個集合中接受那些對象類型。編譯器自動地爲你的插入進行轉化,並在編譯時告知是否插入了類型錯誤的對象。
關於 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 );
線程池的核心線程數。在沒有設置 allowCoreThreadTimeOut 爲 true 的狀況下,核心線程會在線程池中一直存活,即便處於閒置狀態。
線程池所能容納的最大線程數。當活動線程 (核心線程 + 非核心線程) 達到這個數值後,後續任務將會根據 RejectedExecutionHandler 來進行拒絕策略處理。
非核心線程
閒置時的超時時長。超過該時長,非核心線程就會被回收。若線程池經過allowCoreThreadTimeOut()
方法設置 allowCoreThreadTimeOut 屬性爲 true,則該時長一樣會做用於核心線程,AsyncTask 配置的線程池就是這樣設置的。
keepAliveTime 時長對應的單位。
線程池中的任務隊列,經過線程池的 execute() 方法提交的 Runnable 對象會存儲在該隊列中。
線程工廠,功能很簡單,就是爲線程池提供建立新線程的功能。這是一個接口,能夠經過自定義,作一些自定義線程名的操做。
當任務沒法被執行時 (超過線程最大容量 maximum 而且 workQueue 已經被排滿了) 的處理策略,這裏有四種任務拒絕類型。
任務隊列 workQueue 是用於存放不能被及時處理掉的任務的一個隊列,它是
一個 BlockingQueue 類型。
關於 BlockingQueue,雖然它是 Queue 的子接口,可是它的主要做用並非容器,而是做爲線程同步的工具,他有一個特徵,當生產者試圖向 BlockingQueue 放入 (put) 元素,若是隊列已滿,則該線程被阻塞;當消費者試圖從 BlockingQueue 取出 (take) 元素,若是隊列已空,則該線程被阻塞。(From 瘋狂 Java 講義)
當線程池中的數量等於最大線程數時拋 java.util.concurrent.RejectedExecutionException 異常,涉及到該異常的任務也不會被執行,線程池默認的拒絕策略就是該策略。
當線程池中的數量等於最大線程數時, 默默丟棄不能執行的新加任務,不報任何異常。
當線程池中的數量等於最大線程數時,重試添加當前的任務;它會自動重複調用 execute()方法。
當線程池中的數量等於最大線程數時, 拋棄線程池中工做隊列頭部的任務(即等待時間最久的任務),並執行新傳入的任務。
本文將詳細分析 ThreadPoolExecutor 的實現原理,並結合源碼介紹 ThreadPoolExecutor 的重要操做,對理解 ThreadPoolExecutor 很是有幫助。本文中源碼基於 JDK1.7
本文詳細解釋了運用反射進行代碼編寫時遭遇到的各類常見的 Exception,以及使用反射時須要注意的一些細節問題。
ThreadPoolExecutor線程池
分析線程池源碼
代理模式是java中最經常使用的設計模式之一,尤爲是在spring框架中普遍應用。對於java的代理模式,通常可分爲:靜態代理、動態代理、以及CGLIB實現動態代理。對於上述三種代理模式,分別進行說明。
專欄 | 九章算法 網址 | www.jiuzhang.com 最少操做數使數組元素相等 I 題目描述 給定一個長度爲n的非空整數數組,找出使數組全部元素均相等的最少操做數,其中一次操做將其中n-1個數加上1。 樣例 輸入: [1,2,3] 輸出: 3 說明: 最少3次操做到達…
主要是對hash算法中運用到的知識進行進一步的解析,幫助初學者進一步揭開hash算法的神祕面紗。