线程池的创建和使用

目录

 创建线程池

多线程用线程池的两种方式(一般用第二种) 


注意:项目当中线程池尽量不要使用的时候再创建(不要再业务逻辑中创建),这样每次调用这个方法都会创建一个线程池,应该在项目启动的时候就创建好

 创建线程池

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接口查询;自己的方法很复杂,需要查询很多次数据库)

实现:

这里有三个方法

 将任务扔到线程池里面去使用

 在任务完成之前阻塞(不关心返回值时不用加)

猜你喜欢

转载自blog.csdn.net/qq_52240237/article/details/132210275