无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。
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
线程池满或队列满时的拒绝执行策略
整个线程池原型的原理总结如下: