目录
创建线程池
多线程用线程池的两种方式(一般用第二种)
注意:项目当中线程池尽量不要使用的时候再创建(不要再业务逻辑中创建),这样每次调用这个方法都会创建一个线程池,应该在项目启动的时候就创建好
创建线程池
config中创建一个ThreadPoolConfig类(自定义类名)
加上@Configuration:告诉spring这是个配置类,需要在启动的时候加载
@Bean public static ExcutorService getExecutor(){ //ExcutorService线程池 }
这里的意思是: 在启动的时候创建这个类的这个方法,这个方法会返回一个对象,把这个对象交给spring去管理
创建对象
第一种是用set方法去赋值,第二种是用builder去赋值
@Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在类上,提供类的全参构造
@NoArgsConstructor : 注在类上,提供类的无参构造
(这两个的作用是相等的)
创建一个线程池
ExecutorBuilder类中的参数
这些魔法值可以放到配置文件中,也可以写一个常量放在这,这里选用配置文件(注:配置文件一般都是小写的)
或者
线程池的创建
这里参数的意思分别是:核心线程数、最大线程数、线程存活时间(多久不干活就给回收了)、拒绝策略(有一个类ThreadPoolExcutor专门放拒绝策略)(这里设为让主线程去执行)、队列(这里队列大小为2000)、线程前缀、允许核心线程超时
因为我们创建的时候已经交给spring去管理了,所以用的时候直接去spring中拿就行(和interface一样)
多线程用线程池的两种方式(一般用第二种)
第一种:异步的注解@Asyc
给spring创建的线程池对象起个名字
第二种: jdk1.8提供的类CompletableFuture
(这里的意思是:开启一个异步任务,把这个任务扔到线程池excutorService里面去执行)
这里有两种情况
一种情况是将任务交给线程池去做,不需要关注任务的执行情况。将任务交给线程池,主线程释放(主要适用于一些更新操作);另一种情况是将任务交给线程池之后,主线程堵塞等待查询结果。(主要适用于:需要for循环查询数据库;需要循环调用http接口查询;自己的方法很复杂,需要查询很多次数据库)
实现:
这里有三个方法
将任务扔到线程池里面去使用
在任务完成之前阻塞(不关心返回值时不用加)