【JAVA】springboot2 中自定义多个线程池实现异步处理引入ThreadPoolExecutor的内部执行原理

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

springboot2中线程池的定义

@Configuration
public class ThreadPoolConfig {

	@Bean
	public Executor logExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setThreadNamePrefix("myLog-");
		executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() << 1 + 1);
		executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
		return executor;
	}

	@Bean
	public Executor bizExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setThreadNamePrefix("myBiz-");
		executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() << 1 + 1);
		executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
		return executor;
	}

}

如上,定义了两个线程池,线程池中线程名字的前缀自定义,设置了线程池大小和核心线程数,这里其实可以继续设置其它参数,入拒绝策略,线程池中任务队列大小等

ThreadPoolTaskExecutor 这个类是springboot中的,其实它内部使用的也是ThreadPoolExecutor,大家自定义线程池也都是通过ThreadPoolExecutor来做的,所以都逃不掉这个类。

可以看到最终提交任务给线程池工作的时候也是通过JDK的ExecutorService去提交的。

异步执行

有了上面的基于springboot2的线程池自定义,那么异步任务如何实现?

通过Async注解来标明该方法的异步执行,括号内的bizExecutor就是我们自定义线程池的方法名,表明该异步执行的任务通过哪个线程池来完成。

ThreadPoolExecutor原理

corePoolSize

线程池的核心线程数,最小线程数

maximumPoolSize

线程池中最大线程数

keepAliveTime

超过core数量的空闲线程的存活时间,超过则被销毁

unit

时间单位

workQueue

阻塞队列,用来保存等待执行的任务

threadFactory

线程工厂,创建线程时的自定义方法,比如线程名,定位问题方便查找

handler

线程池满或队列满时的拒绝执行策略

整个线程池原型的原理总结如下:

发布了223 篇原创文章 · 获赞 208 · 访问量 72万+

猜你喜欢

转载自blog.csdn.net/chiweitree/article/details/104222213