- 先创建一个ThreadFactory
import java.util.concurrent.ThreadFactory;
/**
* 线程池工厂
*
* @author xiaoxiong
*/
public class ThreadPoolFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable runnable) {
return new Thread(runnable, "自定义名称");
}
}
- 使用ThreadPoolExecutor创建线程池
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
/**
* 线程池
*
* @author xiaoxiong
*/
@Component
public class MyThreadPool {
private final int CORE_SIZE = Runtime.getRuntime().availableProcessors();
private final int CORE_POOL_SIZE = CORE_SIZE * 5;
private final int MAX_MUM_POOL_SIZE = CORE_POOL_SIZE * 2;
private final long KEEP_ALIVE_TIME = 3L;
private final TimeUnit UNIT = TimeUnit.SECONDS;
private final ExecutorService THREAD_POOL = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAX_MUM_POOL_SIZE, KEEP_ALIVE_TIME, UNIT,
new LinkedBlockingQueue<>(), new ThreadPoolFactory());
以下资料来源: CSDN
线程池参数介绍
corePoolSize:核心线程数。核心线程会一直存在,即使没有任务执行;当线程数小于核心线程数的时候,即使有空闲线程,也会一直创建线程直到达到核心线程数;通常设置为1就可以了。
maximumPoolSize:最大线程数。是线程池里允许存在的最大线程数量;
keepAliveTime:线程空闲时间。当线程空闲时间达到keepAliveTime时,线程会退出(关闭),直到线程数等于核心线程数。
workQueue:阻塞队列。建议使用有界队列,比如ArrayBlockingQueue先进先出队列,创建时指定大小
ThreadFactory:线程创建工厂。一般用来设置线程名称的。
handler:拒绝策略。一般用来做日志记录等。
线程池大小配置
一般根据任务类型进行区分, 假设CPU为N核
CPU密集型任务,即需要进行大量计算的任务,需要减少线程数量, 降低线程切换造成的开销, 可配置线程池大小为N + 1.
IO密集型任务,即需要通过网络来交互的任务,通常是指数据库数据交互、文件上传下载、网络数据传输等任务。可以加大线程数量, 配置线程池大小为 N * 2。但实际情况中可以通过自己的测试来设置合理的数值,通过与大牛的交流得知,这个数值可以设置为CPU核心数/(1-阻塞系数),阻塞系数一般在0.8~0.9之间。比如8核CPU可以设置为:8*(1-0.9)=80。
混合型任务则可以拆分为CPU密集型与IO密集型, 独立配置.
注意:在java中获取CPU核心数可以用以下代码:
Runtime.getRuntime().availableProcessors();