java实现异步任务 AsyncManager AsyncFactory
1 应用场景
当我们需要多线程执行耗时的任务,比如发送邮件时,就可以设置异步任务
2 创建执行器
直接把下面的代码复制到项目中
import com.javasm.common.util.SpringContainerUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
public class AsyncManager {
//声明带线程池的执行器
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
//声明一个自定义类 这个类用来管理定时任务的调度器
private static AsyncManager asyncManager;
//单例 构造函数私有化
private AsyncManager(){
//使用自定义的工具类从spring容器中获取对象
threadPoolTaskExecutor = SpringContainerUtils.getBean(ThreadPoolTaskExecutor.class);
//获取核心线程池
System.out.println(threadPoolTaskExecutor.getCorePoolSize());
}
//单例模式 对外公开的方法 用于获取对象
public static AsyncManager getInstance(){
if (asyncManager==null){
asyncManager=new AsyncManager();
}
return asyncManager;
}
//传入Runnable类对象 执行器就会执行这个对象的指定的任务 比如把下面的AsyncFactory类的方法作为参数传入
public void executor(Runnable runnable){
threadPoolTaskExecutor.execute(runnable);
}
//停止线程运行
public void shutDown() {
threadPoolTaskExecutor.shutdown();
}
}
3 设置执行器的线程池
执行器中构造的ThreadPoolTaskExecutor类自带线程池,而具体的线程池数可以在springboot项目的yml配置文件中设置
task:
execution:
pool:
core-size: 50
4 设置任务
有了异步任务的执行器,也设置了线程池大小,接下来就要给出具体要执行的任务,这些任务全部写在一个单独的类中
在这个类中的方法执行时都是多线程的
import com.javasm.common.util.SpringContainerUtils;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
public class AsyncFactory {
/**
*多线程发送邮件
*/
//这个类中每个异步任务单独写一个返回类型为Runnable的方法
public static Runnable sendEmail(String email,String content){
//其他地方是固定写法 在这个代码块中 写要执行的任务
Runnable runnable=()->{
//创建一个SimpleMailMessage 用于发送邮件
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//设置具体属性
simpleMailMessage.setFrom("邮箱地址");
simpleMailMessage.setTo(email);
simpleMailMessage.setSubject("定时发送");
simpleMailMessage.setText(content);
//使用自定义的工具类 从spring容器中取出JavaMailSender对象
JavaMailSender bean = SpringContainerUtils.getBean(JavaMailSender.class);
//使用JavaMailSender对象的方法,发送右键
bean.send(simpleMailMessage);
};
return runnable;
}
//可以继续写其他要异步执行的任务
}