线程池的基础知识
如果不了解线程池,可以先看一下基础知识。
详情见: https://www.cnblogs.com/expiator/p/9053754.html
线程数的设置
详情见: https://www.cnblogs.com/expiator/p/17087726.html
为什么要自定义线程池
由于Executors.newCachedThreadPool()最大线程数设置为最大的Integer.MAX_VALUE,如果最大线程数maximumPoolSize达到最大,那么会导致OOM异常。
而Executors.newFixedThreadPool(),使用的LinkedBlockingQueue()是一个无界队列,队列长度可达到Integer.MAX_VALUE,如果瞬间请求非常大,会有OOM的风险。
使用自定义线程池ThreadPoolExecutor,可以控制最大线程数、阻塞队列长度,避免OOM。
自定义线程池
参数ThreadFactory threadFactory,创建线程或线程池时指定有意义的线程名称,方便出错时回溯。
public class ThreadPoolUtil {
public static ThreadPoolExecutor EXECUTOR ;
/**
* 自定义线程池,初始化
*/
static {
initExecutor();
}
/**
* 自定义线程池,初始化
*/
public static void initExecutor() {
//参数可以写到配置里面,更加灵活
//核心线程数
int corePoolSize = 20;
//最大线程数
int maximumPoolSize = 200;
//存活时间及单位
long keepAliveTime = 2;
TimeUnit timeUnit = TimeUnit.SECONDS;
//阻塞队列长度
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
//创建线程或线程池时指定有意义的线程名称,方便出错时回溯。
ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat("demo-pool-%d").build();
//可以自定义拒绝策略,也可以不加这个参数,构造方法会直接用默认的拒绝策略
ThreadPoolExecutor.AbortPolicy abortPolicy = new ThreadPoolExecutor.AbortPolicy();
EXECUTOR = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, timeUnit, workQueue, threadFactory);
}
/**
* 获取线程池
* @return
*/
public static ThreadPoolExecutor getExecutor() {
return EXECUTOR;
}
}
线程池使用示例:
@Slf4j
public class ThreadPoolDemo {
public static void main(String[] args) {
asyncTask();
}
public static void asyncTask() {
//获取线程池
ThreadPoolExecutor executor = ThreadPoolUtil.getExecutor();
CompletableFuture<Void> cf1 = CompletableFuture.runAsync(() -> {
System.out.println("执行任务1");
}, executor);
//第二个任务
CompletableFuture<Void> cf2 = CompletableFuture.runAsync(() -> {
System.out.println("执行任务2");
}, executor);
//所有任务的集合
List<CompletableFuture<Void>> futureList = new ArrayList<>();
futureList.add(cf1);
futureList.add(cf2);
try {
//所有任务的集合,2秒不出结果就超时
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).get(2, TimeUnit.SECONDS);
} catch (Exception e) {
log.error("allOf get error.", e);
}
}
}
标签:线程,自定义,static,new,public,ThreadPoolExecutor
From: https://www.cnblogs.com/expiator/p/17140760.html