package com.miguan.laidian.common.util;
import java.util.concurrent.*;
/**
* 线程池工具类
*
* @param <T>
*/
public class ThreadPoolManager<T> {
/**
* 根据cpu的数量动态的配置核心线程数和最大线程数
*/
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
/**
* 核心线程数 = CPU核心数 + 1
*/
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
/**
* 线程池最大线程数 = CPU核心数 * 2 + 1
*/
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
/**
* 非核心线程闲置时超时10s
*/
private static final int KEEP_ALIVE = 10;
private static ThreadPoolManager sInstance;
/**
* 线程池的对象
*/
private ThreadPoolExecutor executor;
/**
* 要确保该类只有一个实例对象,避免产生过多对象消费资源,所以采用单例模式
*/
private ThreadPoolManager() {
}
public synchronized static ThreadPoolManager getInstance() {
if (sInstance == null) {
sInstance = new ThreadPoolManager();
}
return sInstance;
}
/**
* 获得线程池的大小
*
* @return
*/
public int getPoolSize() {
return executor.getPoolSize();
}
/**
* 开启一个无返回结果的线程
*
* @param r
*/
public void execute(Runnable r) {
if (executor == null) {
/**
* corePoolSize:核心线程数
* maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启)
* keepAliveTime:非核心线程闲置时间超时时长
* unit:keepAliveTime的单位
* workQueue:等待队列,存储还未执行的任务
* threadFactory:线程创建的工厂
* handler:异常处理机制
*
*/
executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,
KEEP_ALIVE, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
}
// 把一个任务丢到了线程池中
executor.execute(r);
}
/**
* 开启一个有返回结果的线程
*
* @param r
* @return
*/
public Future<T> submit(Callable<T> r) {
if (executor == null) {
/**
* corePoolSize:核心线程数
* maximumPoolSize:线程池所容纳最大线程数(workQueue队列满了之后才开启)
* keepAliveTime:非核心线程闲置时间超时时长
* unit:keepAliveTime的单位
* workQueue:等待队列,存储还未执行的任务
* threadFactory:线程创建的工厂
* handler:异常处理机制
*
*/
executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,
KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
}
// 把一个任务丢到了线程池中
return executor.submit(r);
}
/**
* 把任务移除等待队列
*
* @param r
*/
public void cancel(Runnable r) {
if (r != null) {
executor.getQueue().remove(r);
}
}
}
通过CPU性能开启线程池,合理使用线程池
最新推荐文章于 2024-10-18 14:57:39 发布