日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java ThreadPool線程池的使用,線程池工具類用法說明

瀏覽:24日期:2022-08-23 09:52:52

實際上java已經提供線程池的實現 ExecutorService。

為了更方便的使用和管理。這里提供一個線程池工具類,方便大家的使用。

直接看看代碼:

使用

public static void main(String[] args) { //實例化一個固定數目的線程池。具體參考類的構造方法 ThreadPool threadPool=new ThreadPool(ThreadPool.FixedThread,5); //線程池執行線程 threadPool.execute(new Runnable() { @Override public void run() { } }); }

工具類:

package com.rbl.ncf.common.plugin.threadpool; import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.util.Collection;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ScheduledFuture;import java.util.concurrent.TimeUnit;import java.util.concurrent.TimeoutException; /** *線程池工具類 */public class ThreadPool { public static final int FixedThread = 0; public static final int CachedThread = 1; public static final int SingleThread = 2; @Retention(RetentionPolicy.SOURCE) public @interface Type { } private ExecutorService exec; private ScheduledExecutorService scheduleExec; private ThreadPool() { throw new UnsupportedOperationException('u can’t instantiate me...'); } /** * ThreadPoolUtils構造函數 * * @param type 線程池類型 * @param corePoolSize 只對Fixed和Scheduled線程池起效 */ public ThreadPool(final int type, final int corePoolSize) { // 構造有定時功能的線程池 // ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE, 10L, TimeUnit.MILLISECONDS, new // BlockingQueue<Runnable>) scheduleExec = Executors.newScheduledThreadPool(corePoolSize); switch (type) { case FixedThread:// 構造一個固定線程數目的線程池// ThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new// LinkedBlockingQueue<Runnable>());exec = Executors.newFixedThreadPool(corePoolSize);break; case SingleThread:// 構造一個只支持一個線程的線程池,相當于newFixedThreadPool(1)// ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new// LinkedBlockingQueue<Runnable>())exec = Executors.newSingleThreadExecutor();break; case CachedThread:// 構造一個緩沖功能的線程池// ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new// SynchronousQueue<Runnable>());exec = Executors.newCachedThreadPool();break; } } /** * 在未來某個時間執行給定的命令 <p>該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由 Executor 實現決定。</p> * * @param command 命令 */ public void execute(final Runnable command) { exec.execute(command); } /** * 在未來某個時間執行給定的命令鏈表 <p>該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由 Executor 實現決定。</p> * * @param commands 命令鏈表 */ public void execute(final List<Runnable> commands) { for (Runnable command : commands) { exec.execute(command); } } /** * 待以前提交的任務執行完畢后關閉線程池 <p>啟動一次順序關閉,執行以前提交的任務,但不接受新任務。 如果已經關閉,則調用沒有作用。</p> */ public void shutDown() { exec.shutdown(); } /** * 試圖停止所有正在執行的活動任務 <p>試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,并返回等待執行的任務列表。</p> * <p>無法保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。</p> * * @return 等待執行的任務的列表 */ public List<Runnable> shutDownNow() { return exec.shutdownNow(); } /** * 判斷線程池是否已關閉 * * @return {@code true}: 是<br>{@code false}: 否 */ public boolean isShutDown() { return exec.isShutdown(); } /** * 關閉線程池后判斷所有任務是否都已完成 <p>注意,除非首先調用 shutdown 或 shutdownNow,否則 isTerminated 永不為 true。</p> * * @return {@code true}: 是<br>{@code false}: 否 */ public boolean isTerminated() { return exec.isTerminated(); } /** * 請求關閉、發生超時或者當前線程中斷 <p>無論哪一個首先發生之后,都將導致阻塞,直到所有任務完成執行。</p> * * @param timeout 最長等待時間 * @param unit 時間單位 * @return {@code true}: 請求成功<br>{@code false}: 請求超時 * @throws InterruptedException 終端異常 */ public boolean awaitTermination(final long timeout, final TimeUnit unit) throws InterruptedException { return exec.awaitTermination(timeout, unit); } /** * 提交一個Callable任務用于執行 <p>如果想立即阻塞任務的等待,則可以使用{@code result = exec.submit(aCallable).get();} * 形式的構造。</p> * * @param task 任務 * @param <T> 泛型 * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務的結果。 */ public <T> Future<T> submit(final Callable<T> task) { return exec.submit(task); } /** * 提交一個Runnable任務用于執行 * * @param task 任務 * @param result 返回的結果 * @param <T> 泛型 * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務的結果。 */ public <T> Future<T> submit(final Runnable task, final T result) { return exec.submit(task, result); } /** * 提交一個Runnable任務用于執行 * * @param task 任務 * @return 表示任務等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回null結果。 */ public Future<?> submit(final Runnable task) { return exec.submit(task); } /** * 執行給定的任務 <p>當所有任務完成時,返回保持任務狀態和結果的Future列表。 返回列表的所有元素的{@link Future#isDone}為{@code true}。 * 注意,可以正常地或通過拋出異常來終止已完成任務。 如果正在進行此操作時修改了給定的 collection,則此方法的結果是不確定的。</p> * * @param tasks 任務集合 * @param <T> 泛型 * @return 表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同,每個任務都已完成。 * @throws InterruptedException 如果等待時發生中斷,在這種情況下取消尚未完成的任務。 */ public <T> List<Future<T>> invokeAll(final Collection<? extends Callable<T>> tasks) throws InterruptedException { return exec.invokeAll(tasks); } /** * 執行給定的任務 <p>當所有任務完成或超時期滿時(無論哪個首先發生),返回保持任務狀態和結果的Future列表。 返回列表的所有元素的{@link Future#isDone}為 * {@code true}。 一旦返回后,即取消尚未完成的任務。 注意,可以正常地或通過拋出異常來終止已完成任務。 如果此操作正在進行時修改了給定的 * collection,則此方法的結果是不確定的。</p> * * @param tasks 任務集合 * @param timeout 最長等待時間 * @param unit 時間單位 * @param <T> 泛型 * @return 表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同。如果操作未超時,則已完成所有任務。如果確實超時了,則某些任務尚未完成。 * @throws InterruptedException 如果等待時發生中斷,在這種情況下取消尚未完成的任務 */ public <T> List<Future<T>> invokeAll(final Collection<? extends Callable<T>> tasks, final long timeout, final TimeUnit unit) throws InterruptedException { return exec.invokeAll(tasks, timeout, unit); } /** * 執行給定的任務 <p>如果某個任務已成功完成(也就是未拋出異常),則返回其結果。 一旦正常或異常返回后,則取消尚未完成的任務。 * 如果此操作正在進行時修改了給定的collection,則此方法的結果是不確定的。</p> * * @param tasks 任務集合 * @param <T> 泛型 * @return 某個任務返回的結果 * @throws InterruptedException 如果等待時發生中斷 * @throws ExecutionException 如果沒有任務成功完成 */ public <T> T invokeAny(final Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException { return exec.invokeAny(tasks); } /** * 執行給定的任務 <p>如果在給定的超時期滿前某個任務已成功完成(也就是未拋出異常),則返回其結果。 一旦正常或異常返回后,則取消尚未完成的任務。 * 如果此操作正在進行時修改了給定的collection,則此方法的結果是不確定的。</p> * * @param tasks 任務集合 * @param timeout 最長等待時間 * @param unit 時間單位 * @param <T> 泛型 * @return 某個任務返回的結果 * @throws InterruptedException 如果等待時發生中斷 * @throws ExecutionException 如果沒有任務成功完成 * @throws TimeoutException 如果在所有任務成功完成之前給定的超時期滿 */ public <T> T invokeAny(final Collection<? extends Callable<T>> tasks, final long timeout, final TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return exec.invokeAny(tasks, timeout, unit); } /** * 延遲執行Runnable命令 * * @param command 命令 * @param delay 延遲時間 * @param unit 單位 * @return 表示掛起任務完成的ScheduledFuture,并且其{@code get()}方法在完成后將返回{@code null} */ public ScheduledFuture<?> schedule(final Runnable command, final long delay, final TimeUnit unit) { return scheduleExec.schedule(command, delay, unit); } /** * 延遲執行Callable命令 * * @param callable 命令 * @param delay 延遲時間 * @param unit 時間單位 * @param <V> 泛型 * @return 可用于提取結果或取消的ScheduledFuture */ public <V> ScheduledFuture<V> schedule(final Callable<V> callable, final long delay, final TimeUnit unit) { return scheduleExec.schedule(callable, delay, unit); } /** * 延遲并循環執行命令 * * @param command 命令 * @param initialDelay 首次執行的延遲時間 * @param period 連續執行之間的周期 * @param unit 時間單位 * @return 表示掛起任務完成的ScheduledFuture,并且其{@code get()}方法在取消后將拋出異常 */ public ScheduledFuture<?> scheduleWithFixedRate(final Runnable command, final long initialDelay, final long period, final TimeUnit unit) { return scheduleExec.scheduleAtFixedRate(command, initialDelay, period, unit); } /** * 延遲并以固定休息時間循環執行命令 * * @param command 命令 * @param initialDelay 首次執行的延遲時間 * @param delay 每一次執行終止和下一次執行開始之間的延遲 * @param unit 時間單位 * @return 表示掛起任務完成的ScheduledFuture,并且其{@code get()}方法在取消后將拋出異常 */ public ScheduledFuture<?> scheduleWithFixedDelay(final Runnable command, final long initialDelay, final long delay, final TimeUnit unit) { return scheduleExec.scheduleWithFixedDelay(command, initialDelay, delay, unit); } }

補充知識:Java線程池之ThreadPoolExecutor以及工具類Executors類

首先,介紹線程池的概念。

簡單講,就是有一個“池”內放著一些已經啟動的線程,這些線程一直啟動,用來執行線程池接受的任務。這些線程我們稱為核心線程。

當接收任務過多時,會進入阻塞隊列進行存儲。

而如果阻塞隊列也滿,則會創建線程來執行任務,這些任務稱為救急線程。救急線程任務結束后會根據存活時間來釋放

ThreadPoolExecutor的創建參數就是基于上述的概念:

ThreadPoolExecutor(int corePoolSize,//核心線程數目 int maximumPoolSize,//最大線程數 = 核心線程數 + 救急線程數 long keepAliveTime,//救急線程的存活超時時間 TimeUnit unit,//超時時間的單位 BlockingQueue<Runnable> workQueue,//阻塞隊列 ThreadFactory threadFactory,//線程工廠,主要用于給線程起名, RejectedExecutionHandler handler)//拒絕策略,即隊列滿了后再接受任務怎么處理

會有多種構造方法,常用的是前5個參數的構造。本質上都是調用了這個構造方法

ThreadPoolExecutor類繼承自AbstractExecutorService類,而AbstractExecutorService類實現了ExecutorService接口。(因為后面工具類的返回值是ExecutorService接口對象,而不是ThreadPoolExecutor對象)。線程池操作都定義在ExecutorService接口中。

根據不同的需求,會產生不同的線程池。為了方便,有了Executors類來創建一些常用的線程池,注意的是返回值是ExecutorService對象

需求一:固定大小的線程池,即Executors.newFixedThreadPool(corePoolSize)。是只有一定數量的核心數量(參數),即核心數目等于總數目。阻塞隊列使用的是LinkedBlockingQueue<Runnable>。適應于任務數量已知,且相對耗時

本質是調用了

ThreadPoolExecutor(corePoolSize,coreSize,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>() )

需求二、帶緩沖區的線程隊列,即Executors.newCachedThreadPool()。沒有核心線程,全都是救急線程。超時時間設為60秒。阻塞隊列使用的是SynchronousQueue<Runnable>。 該隊列沒有容量,沒有線程取任務是不能夠放任務的。

本質調用:

ThreadPoolExecutor(0,Integer.MAx_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>() )

需求三:單線程線程池:即Executors.newSingleThreadPool() , 即需求一的特殊情況,只有一個核心線程。即:

ThreadPoolExecutor(1,1,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>() )

以上這篇java ThreadPool線程池的使用,線程池工具類用法說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品夜夜夜| 日韩一区精品视频| 欧美日韩第一| 久久精品国产福利| 国产欧美日韩免费观看| 蜜臀av在线播放一区二区三区| 嫩呦国产一区二区三区av| 精品一区二区三区免费看| 精品五月天堂| 中文字幕在线官网| 久久不卡日韩美女| 国产精品国产三级在线观看| 91精品国产自产精品男人的天堂| 日韩中文字幕亚洲一区二区va在线 | 国产婷婷精品| 激情欧美一区| 久久av在线| 性色av一区二区怡红| 9国产精品视频| 免费成人av在线播放| 青草久久视频| 日本黄色精品| 免费成人性网站| 老司机精品视频网| 亚洲欧美久久精品| 加勒比视频一区| 午夜在线观看免费一区| 高清日韩中文字幕| 免费国产自久久久久三四区久久| 国产精品亚洲综合色区韩国| 蜜桃成人精品| 国产日韩欧美三区| 久久精品青草| 欧美日韩尤物久久| 国产亚洲综合精品| 国产另类在线| 亚洲中字黄色| 视频二区不卡| 久久国产免费看| 在线一区电影| 国内精品伊人| 欧美三级第一页| 午夜久久美女| 日韩欧美在线中字| 国产精品最新| 婷婷亚洲成人| 在线综合视频| 日韩深夜视频| 欧美精品九九| 麻豆视频在线看| 中文字幕免费精品| 高清一区二区三区av| 亚洲色图网站| 老司机精品久久| 国产精品伦一区二区| 国产黄色一区| 午夜亚洲福利在线老司机| 日韩av一区二区三区| 欧美日韩一区自拍| 视频在线在亚洲| 日本精品黄色| 91久久精品无嫩草影院| 亚洲手机视频| 国产乱人伦丫前精品视频| 亚洲男女av一区二区| 精品国产美女a久久9999| 首页国产欧美日韩丝袜| 国产一区二区三区自拍| 久久99精品久久久野外观看| 天堂va蜜桃一区二区三区| 日韩亚洲一区在线| 美女尤物国产一区| 亚洲视频二区| 在线视频免费在线观看一区二区| 色婷婷色综合| 精品视频网站| 亚洲日本国产| 欧美精品影院| 亚洲欧洲国产精品一区| 亚洲激情不卡| 九九久久婷婷| 激情五月色综合国产精品| 捆绑调教日本一区二区三区| 国产一区二区久久久久| 欧美黄色一区二区| 精品一区不卡| 中文字幕高清在线播放| a日韩av网址| 精品在线99| 美女国产一区| 欧美日本精品| 日韩精品欧美大片| 国产精品magnet| 国产欧美成人| 久久精品国产免费| 日韩欧美午夜| 亚洲精品a级片| 亚洲小说春色综合另类电影| 日韩高清不卡一区| 另类欧美日韩国产在线| 精品国产午夜肉伦伦影院| 国产精品99一区二区三区| 亚洲婷婷免费| 久久国产精品久久久久久电车| 美女福利一区二区三区| 九色porny丨国产首页在线| 国产日韩一区二区三区在线| 精品中文字幕一区二区三区四区| 欧美精品国产| 久久国产欧美| 免费在线亚洲| 综合激情婷婷| 狠狠久久伊人中文字幕| 女同性一区二区三区人了人一| 国产激情精品一区二区三区| 免费久久99精品国产| 日韩精品成人| 久久国产日韩| 欧美日韩一区二区三区不卡视频| 欧美一级一区| 欧美特黄一区| 国产一区二区三区不卡av| 国产日本精品| 亚洲二区在线| 精品在线网站观看| 欧美视频一区| 午夜精品成人av| 伊人精品视频| 日韩免费小视频| 欧美成人精品午夜一区二区| 亚洲不卡视频| 日韩午夜免费| 91精品国产乱码久久久久久久| 国产美女久久| 亚洲精品亚洲人成在线观看| 蜜桃av一区二区三区电影| 久久都是精品| 91视频久久| 国产精品专区免费| 国产精品任我爽爆在线播放| 91成人精品| 日本午夜精品视频在线观看| 国产精品一页| 一区二区视频欧美| 国产成人久久精品麻豆二区 | 精品丝袜在线| 精品国产欧美日韩| 福利精品在线| 福利一区二区免费视频| 日本美女一区| 国产欧美丝祙| 成人片免费看| 精品国模一区二区三区| 久久久五月天| 亚洲国产不卡| 日本国产一区| 国产精品欧美日韩一区| 国产日韩高清一区二区三区在线 | 精品亚洲成人| 精品一区二区三区视频在线播放| 青青草伊人久久| 奇米亚洲欧美| 婷婷五月色综合香五月| 免播放器亚洲一区| 亚洲综合图色| 日韩亚洲精品在线观看| 日韩精品一区二区三区免费视频| 日韩精品欧美成人高清一区二区| 四虎精品一区二区免费| 久久精品xxxxx| 美日韩一区二区三区| 久久中文字幕导航| 日韩欧美一区二区三区在线视频 | 中文字幕一区二区av| 久久福利精品| 亚洲v天堂v手机在线| 91精品国产经典在线观看| 国产精品久久久久毛片大屁完整版| 亚洲精品一级| 国产精品久久久网站| 国产综合精品| 国产精品v亚洲精品v日韩精品| 男女男精品网站| 日韩高清二区| 亚洲综合日韩| 午夜在线视频一区二区区别| 欧美亚洲三级| 麻豆精品在线观看| 中文字幕免费一区二区| 亚洲神马久久| 久久av网址| 日本在线不卡视频| 91av亚洲| 99亚洲视频| 久久久久九九精品影院| 久久精品动漫| 久久精品xxxxx| 久久精品国产亚洲aⅴ| 亚洲福利精品| 午夜在线一区|