java ThreadPool線程池的使用,線程池工具類用法說明
實際上java已經(jīng)提供線程池的實現(xiàn) ExecutorService。
為了更方便的使用和管理。這里提供一個線程池工具類,方便大家的使用。
直接看看代碼:
使用
public static void main(String[] args)
{
//實例化一個固定數(shù)目的線程池。具體參考類的構(gòu)造方法
ThreadPool threadPool=new ThreadPool(ThreadPool.FixedThread,5);
//線程池執(zhí)行線程
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構(gòu)造函數(shù)
*
* @param type 線程池類型
* @param corePoolSize 只對Fixed和Scheduled線程池起效
*/
public ThreadPool(final int type, final int corePoolSize) {
// 構(gòu)造有定時功能的線程池
// ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE, 10L, TimeUnit.MILLISECONDS, new
// BlockingQueue<Runnable>)
scheduleExec = Executors.newScheduledThreadPool(corePoolSize);
switch (type) {
case FixedThread:
// 構(gòu)造一個固定線程數(shù)目的線程池
// ThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new
// LinkedBlockingQueue<Runnable>());
exec = Executors.newFixedThreadPool(corePoolSize);
break;
case SingleThread:
// 構(gòu)造一個只支持一個線程的線程池,相當于newFixedThreadPool(1)
// ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new
// LinkedBlockingQueue<Runnable>())
exec = Executors.newSingleThreadExecutor();
break;
case CachedThread:
// 構(gòu)造一個緩沖功能的線程池
// ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new
// SynchronousQueue<Runnable>());
exec = Executors.newCachedThreadPool();
break;
}
}
/**
* 在未來某個時間執(zhí)行給定的命令 <p>該命令可能在新的線程、已入池的線程或者正調(diào)用的線程中執(zhí)行,這由 Executor 實現(xiàn)決定。</p>
*
* @param command 命令
*/
public void execute(final Runnable command) {
exec.execute(command);
}
/**
* 在未來某個時間執(zhí)行給定的命令鏈表 <p>該命令可能在新的線程、已入池的線程或者正調(diào)用的線程中執(zhí)行,這由 Executor 實現(xiàn)決定。</p>
*
* @param commands 命令鏈表
*/
public void execute(final List<Runnable> commands) {
for (Runnable command : commands) {
exec.execute(command);
}
}
/**
* 待以前提交的任務(wù)執(zhí)行完畢后關(guān)閉線程池 <p>啟動一次順序關(guān)閉,執(zhí)行以前提交的任務(wù),但不接受新任務(wù)。 如果已經(jīng)關(guān)閉,則調(diào)用沒有作用。</p>
*/
public void shutDown() {
exec.shutdown();
}
/**
* 試圖停止所有正在執(zhí)行的活動任務(wù) <p>試圖停止所有正在執(zhí)行的活動任務(wù),暫停處理正在等待的任務(wù),并返回等待執(zhí)行的任務(wù)列表。</p>
* <p>無法保證能夠停止正在處理的活動執(zhí)行任務(wù),但是會盡力嘗試。</p>
*
* @return 等待執(zhí)行的任務(wù)的列表
*/
public List<Runnable> shutDownNow() {
return exec.shutdownNow();
}
/**
* 判斷線程池是否已關(guān)閉
*
* @return {@code true}: 是<br>{@code false}: 否
*/
public boolean isShutDown() {
return exec.isShutdown();
}
/**
* 關(guān)閉線程池后判斷所有任務(wù)是否都已完成 <p>注意,除非首先調(diào)用 shutdown 或 shutdownNow,否則 isTerminated 永不為 true。</p>
*
* @return {@code true}: 是<br>{@code false}: 否
*/
public boolean isTerminated() {
return exec.isTerminated();
}
/**
* 請求關(guān)閉、發(fā)生超時或者當前線程中斷 <p>無論哪一個首先發(fā)生之后,都將導致阻塞,直到所有任務(wù)完成執(zhí)行。</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任務(wù)用于執(zhí)行 <p>如果想立即阻塞任務(wù)的等待,則可以使用{@code result = exec.submit(aCallable).get();}
* 形式的構(gòu)造。</p>
*
* @param task 任務(wù)
* @param <T> 泛型
* @return 表示任務(wù)等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務(wù)的結(jié)果。
*/
public <T> Future<T> submit(final Callable<T> task) {
return exec.submit(task);
}
/**
* 提交一個Runnable任務(wù)用于執(zhí)行
*
* @param task 任務(wù)
* @param result 返回的結(jié)果
* @param <T> 泛型
* @return 表示任務(wù)等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回該任務(wù)的結(jié)果。
*/
public <T> Future<T> submit(final Runnable task, final T result) {
return exec.submit(task, result);
}
/**
* 提交一個Runnable任務(wù)用于執(zhí)行
*
* @param task 任務(wù)
* @return 表示任務(wù)等待完成的Future, 該Future的{@code get}方法在成功完成時將會返回null結(jié)果。
*/
public Future<?> submit(final Runnable task) {
return exec.submit(task);
}
/**
* 執(zhí)行給定的任務(wù) <p>當所有任務(wù)完成時,返回保持任務(wù)狀態(tài)和結(jié)果的Future列表。 返回列表的所有元素的{@link Future#isDone}為{@code true}。
* 注意,可以正常地或通過拋出異常來終止已完成任務(wù)。 如果正在進行此操作時修改了給定的 collection,則此方法的結(jié)果是不確定的。</p>
*
* @param tasks 任務(wù)集合
* @param <T> 泛型
* @return 表示任務(wù)的 Future 列表,列表順序與給定任務(wù)列表的迭代器所生成的順序相同,每個任務(wù)都已完成。
* @throws InterruptedException 如果等待時發(fā)生中斷,在這種情況下取消尚未完成的任務(wù)。
*/
public <T> List<Future<T>> invokeAll(final Collection<? extends Callable<T>> tasks)
throws InterruptedException {
return exec.invokeAll(tasks);
}
/**
* 執(zhí)行給定的任務(wù) <p>當所有任務(wù)完成或超時期滿時(無論哪個首先發(fā)生),返回保持任務(wù)狀態(tài)和結(jié)果的Future列表。 返回列表的所有元素的{@link Future#isDone}為
* {@code true}。 一旦返回后,即取消尚未完成的任務(wù)。 注意,可以正常地或通過拋出異常來終止已完成任務(wù)。 如果此操作正在進行時修改了給定的
* collection,則此方法的結(jié)果是不確定的。</p>
*
* @param tasks 任務(wù)集合
* @param timeout 最長等待時間
* @param unit 時間單位
* @param <T> 泛型
* @return 表示任務(wù)的 Future 列表,列表順序與給定任務(wù)列表的迭代器所生成的順序相同。如果操作未超時,則已完成所有任務(wù)。如果確實超時了,則某些任務(wù)尚未完成。
* @throws InterruptedException 如果等待時發(fā)生中斷,在這種情況下取消尚未完成的任務(wù)
*/
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);
}
/**
* 執(zhí)行給定的任務(wù) <p>如果某個任務(wù)已成功完成(也就是未拋出異常),則返回其結(jié)果。 一旦正?;虍惓7祷睾?,則取消尚未完成的任務(wù)。
* 如果此操作正在進行時修改了給定的collection,則此方法的結(jié)果是不確定的。</p>
*
* @param tasks 任務(wù)集合
* @param <T> 泛型
* @return 某個任務(wù)返回的結(jié)果
* @throws InterruptedException 如果等待時發(fā)生中斷
* @throws ExecutionException 如果沒有任務(wù)成功完成
*/
public <T> T invokeAny(final Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException {
return exec.invokeAny(tasks);
}
/**
* 執(zhí)行給定的任務(wù) <p>如果在給定的超時期滿前某個任務(wù)已成功完成(也就是未拋出異常),則返回其結(jié)果。 一旦正常或異常返回后,則取消尚未完成的任務(wù)。
* 如果此操作正在進行時修改了給定的collection,則此方法的結(jié)果是不確定的。</p>
*
* @param tasks 任務(wù)集合
* @param timeout 最長等待時間
* @param unit 時間單位
* @param <T> 泛型
* @return 某個任務(wù)返回的結(jié)果
* @throws InterruptedException 如果等待時發(fā)生中斷
* @throws ExecutionException 如果沒有任務(wù)成功完成
* @throws TimeoutException 如果在所有任務(wù)成功完成之前給定的超時期滿
*/
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);
}
/**
* 延遲執(zhí)行Runnable命令
*
* @param command 命令
* @param delay 延遲時間
* @param unit 單位
* @return 表示掛起任務(wù)完成的ScheduledFuture,并且其{@code get()}方法在完成后將返回{@code null}
*/
public ScheduledFuture<?> schedule(final Runnable command, final long delay,
final TimeUnit unit) {
return scheduleExec.schedule(command, delay, unit);
}
/**
* 延遲執(zhí)行Callable命令
*
* @param callable 命令
* @param delay 延遲時間
* @param unit 時間單位
* @param <V> 泛型
* @return 可用于提取結(jié)果或取消的ScheduledFuture
*/
public <V> ScheduledFuture<V> schedule(final Callable<V> callable, final long delay,
final TimeUnit unit) {
return scheduleExec.schedule(callable, delay, unit);
}
/**
* 延遲并循環(huán)執(zhí)行命令
*
* @param command 命令
* @param initialDelay 首次執(zhí)行的延遲時間
* @param period 連續(xù)執(zhí)行之間的周期
* @param unit 時間單位
* @return 表示掛起任務(wù)完成的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);
}
/**
* 延遲并以固定休息時間循環(huán)執(zhí)行命令
*
* @param command 命令
* @param initialDelay 首次執(zhí)行的延遲時間
* @param delay 每一次執(zhí)行終止和下一次執(zhí)行開始之間的延遲
* @param unit 時間單位
* @return 表示掛起任務(wù)完成的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類
首先,介紹線程池的概念。
簡單講,就是有一個“池”內(nèi)放著一些已經(jīng)啟動的線程,這些線程一直啟動,用來執(zhí)行線程池接受的任務(wù)。這些線程我們稱為核心線程。
當接收任務(wù)過多時,會進入阻塞隊列進行存儲。
而如果阻塞隊列也滿,則會創(chuàng)建線程來執(zhí)行任務(wù),這些任務(wù)稱為救急線程。救急線程任務(wù)結(jié)束后會根據(jù)存活時間來釋放
ThreadPoolExecutor的創(chuàng)建參數(shù)就是基于上述的概念:
ThreadPoolExecutor(int corePoolSize,//核心線程數(shù)目
int maximumPoolSize,//最大線程數(shù) = 核心線程數(shù) + 救急線程數(shù)
long keepAliveTime,//救急線程的存活超時時間
TimeUnit unit,//超時時間的單位
BlockingQueue<Runnable> workQueue,//阻塞隊列
ThreadFactory threadFactory,//線程工廠,主要用于給線程起名,
RejectedExecutionHandler handler)//拒絕策略,即隊列滿了后再接受任務(wù)怎么處理
會有多種構(gòu)造方法,常用的是前5個參數(shù)的構(gòu)造。本質(zhì)上都是調(diào)用了這個構(gòu)造方法
ThreadPoolExecutor類繼承自AbstractExecutorService類,而AbstractExecutorService類實現(xiàn)了ExecutorService接口。(因為后面工具類的返回值是ExecutorService接口對象,而不是ThreadPoolExecutor對象)。線程池操作都定義在ExecutorService接口中。
根據(jù)不同的需求,會產(chǎn)生不同的線程池。為了方便,有了Executors類來創(chuàng)建一些常用的線程池,注意的是返回值是ExecutorService對象
需求一:固定大小的線程池,即Executors.newFixedThreadPool(corePoolSize)。是只有一定數(shù)量的核心數(shù)量(參數(shù)),即核心數(shù)目等于總數(shù)目。阻塞隊列使用的是LinkedBlockingQueue<Runnable>。適應(yīng)于任務(wù)數(shù)量已知,且相對耗時
本質(zhì)是調(diào)用了
ThreadPoolExecutor(corePoolSize,coreSize,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>() )
需求二、帶緩沖區(qū)的線程隊列,即Executors.newCachedThreadPool()。沒有核心線程,全都是救急線程。超時時間設(shè)為60秒。阻塞隊列使用的是SynchronousQueue<Runnable>。 該隊列沒有容量,沒有線程取任務(wù)是不能夠放任務(wù)的。
本質(zhì)調(diào)用:
ThreadPoolExecutor(0,Integer.MAx_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>() )
需求三:單線程線程池:即Executors.newSingleThreadPool() , 即需求一的特殊情況,只有一個核心線程。即:
ThreadPoolExecutor(1,1,0,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>() )
以上這篇java ThreadPool線程池的使用,線程池工具類用法說明就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)組使用binarySearch()方法查找指定元素的實現(xiàn)
這篇文章主要介紹了Java數(shù)組使用binarySearch()方法查找指定元素的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
如何實現(xiàn)Java的ArrayList經(jīng)典實體類
ArrayList是Java集合框架中一個經(jīng)典的實現(xiàn)類。他比起常用的數(shù)組而言,明顯的優(yōu)點在于,可以隨意的添加和刪除元素而不需考慮數(shù)組的大小。下面跟著小編一起來看下吧2017-02-02
java實現(xiàn)調(diào)用http請求的五種常見方式
在實際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或測試自己寫的接口是否合適,本文主要介紹了java實現(xiàn)調(diào)用http請求的四種常見方式,感興趣的可以了解一下2024-07-07
使用java實現(xiàn)telnet-client工具分享
這篇文章主要介紹了使用java實現(xiàn)telnet-client工具,需要的朋友可以參考下2014-03-03
老生常談Java中List與ArrayList的區(qū)別
大家都知道List是接口,ArrayList是List接口的一個實現(xiàn)類,接下來通過本文給大家介紹Java中List與ArrayList的區(qū)別,需要的朋友可以參考下2022-08-08
SpringKafka消息發(fā)布之KafkaTemplate與事務(wù)支持功能
通過本文介紹的基本用法、序列化選項、事務(wù)支持、錯誤處理和性能優(yōu)化技術(shù),開發(fā)者可以構(gòu)建高效可靠的Kafka消息發(fā)布系統(tǒng),事務(wù)支持特性尤為重要,它確保了在分布式環(huán)境中的數(shù)據(jù)一致性,感興趣的朋友一起看看吧2025-04-04

