创建带自定义名称的线程池

429 阅读1分钟
  1. 先创建一个ThreadFactory
import java.util.concurrent.ThreadFactory;

/**
 * 线程池工厂
 *
 * @author xiaoxiong
 */
public class ThreadPoolFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable runnable) {
        return new Thread(runnable, "自定义名称");
    }
}
  1. 使用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();