大家好,又见面了,我是你们的朋友全栈君。
有时候有些需求不需要顺序执行,所以我就使用了多线程并行执行。废话不多说,上代码。
1.创建线程池
代码语言:javascript复制package org.java.multithreading;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncTaskConfig implements AsyncConfigurer {
// ThredPoolTaskExcutor的处理流程
// 当池子大小小于corePoolSize,就新建线程,并处理请求
// 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
// 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
// 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁
@Override
public Executor
getAsyncExecutor() {
// 新建一个任务执行器
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(6);// 设置最小的线程数量
taskExecutor.setMaxPoolSize(10);// 设置最大的线程数量
taskExecutor.setQueueCapacity(25);// 等待队列
taskExecutor.initialize();// 初始化
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
2.线程池的参数
代码语言:javascript复制1.corePoolSize 线程池核心线程大小
2.maximumPoolSize 线程池最大线程数量
3.keepAliveTime 空闲线程存活时间
4.unit 空间线程存活时间单位
5.workQueue 工作队列
6.threadFactory 线程工厂
7.handler 拒绝策略
3.使用
只需要在接口上加上@Async 注解就能使用了。
代码语言:javascript复制@Async
public void task() throws IOException {
}
@Async 注解
代码语言:javascript复制@Async的value属性可以指定执行线程池,当其被标注在类或者方法上,用于实现方法的异步执行,当被标注在类上,表明类中的所有方法都被指定的异步执行器执行。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187102.html原文链接:https://javaforall.cn