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;
    }
    
    //可以继续写其他要异步执行的任务
}

 

posted @ 2021-10-05 00:15  夏·舍  阅读(893)  评论(0编辑  收藏  举报