使用Executors创建线程池的思考
程序员文章站
2022-05-01 14:18:42
...
最近遇到了发优惠券相关的业务,由于量大自然想到了使用多线程和线程池,但是在使用中阿里的插件出现了这样的提示“手动创建线程池,效果会更好哦。”仔细一看,它是这样说的:
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样处理的方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
Executors各个方法的弊端
- newFixedThreadPool和newSingleThreadPool: 主要问题是堆积的请求处理队里额可能会耗费非常大的内存,甚至OOM。
- newCachedThreadPool和newScheduledThreadPool: 主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
ali推荐的创建线程池的方式
so,重点来了,它推荐的方式有如下几种:
//Positice example 1:
//org.apache.commons.lang3.concurrent.BasicThreadFactory
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor =
new ScheduledThreadPoolExecutor(1, new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
//Positice example 2:
//Common thread pool
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
ExecutorService pool =
new ThreadPoolExecutor(5, 200, 0L,
TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>(2014), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
pool.execute(() -> System.out.print(Thread.currentThread().getName()));
pool.shutdown();
//Positice example 3:
<bean id="userThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<prpperty name="corePoolSize" value="10" />
<prpperty name="maxPoolSize" value="100" />
<prpperty name="queueCapacity" value="2000" />
<prpperty name="threadFactory" value="threadFactory">
<prpperty name="rejectExecutionHandler">
<ref local="rejectExecutionHandler" />
</prpperty>
</prpperty>
</bean>
//in code
userThreadPool.execute(thread);
并发线程池到底设置多大呢?
说完了线程池如何创建,咱们再说说线程池的大小,通常可参考以下方案:
1、CPU 密集型应用,线程池大小设置为 N + 1
2、IO 密集型应用,线程池大小设置为 2N
ps:N代表的是CPU个数
上一篇: 线程池(Executors)
下一篇: spring boot 异步任务
推荐阅读
-
在spring boot中使用java线程池ExecutorService的讲解
-
java并发编程_线程池的使用方法(详解)
-
Spring Boot 配置和使用多线程池的实现
-
Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能
-
浅谈Android 的线程和线程池的使用
-
Java ThreadPoolExecutor 线程池的使用介绍
-
Spring Boot 配置和使用多线程池的实现
-
spring boot使用自定义配置的线程池执行Async异步任务
-
java线程之使用Runnable接口创建线程的方法
-
Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能