线程池和异步方法

使用情景:

当处理某项较为耗时的操作时,一般需要新启动一个线程来完成。这样不影响主线程的工作。

简要步骤

1 先配置线程池
2 在异步方法上@Async注解,该方法就变成异步方法。会另起线程执行该方法

注意

异步方法要交给spring容器托管,比如写在service里。否则不起作用

  • 配置线程池
package com.vegetables.common.config;

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;

@Slf4j
@Configuration
@EnableAsync
public class ThreadAsyncConfigurer implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        //设置核心线程数
        threadPool.setCorePoolSize(10);
        //设置最大线程数
        threadPool.setMaxPoolSize(100);
        //线程池所使用的缓冲队列
        threadPool.setQueueCapacity(10);
        //等待任务在关机时完成--表明等待所有线程执行完
        threadPool.setWaitForTasksToCompleteOnShutdown(true);
        // 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
        threadPool.setAwaitTerminationSeconds(60);
        //  线程名称前缀
        threadPool.setThreadNamePrefix("QQ-MAIL-");
        // 初始化线程
        threadPool.initialize();
        return threadPool;

    }

    //配置异步线程出现异常的处理
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (exception, method, params) -> {
            log.error("async method has uncaught exception, params : {}", Arrays.toString(params));
            log.error("method : {}", method);
            log.error("exception : {}", ExceptionUtils.getStackTrace(exception));
        };
    }

}
  • 异步方法,另起线程执行
    //异步方法,另起线程
    @Async
    public void senEmail(String emailAddress, String emailMessage) throws Exception {
        log.info("Thread - {}", Thread.currentThread().getName());
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", PROTOCOL);
        props.setProperty("mail.smtp.host", HOST);
        props.setProperty("mail.smtp.auth", AUTH);
        props.setProperty("mail.smtp.port", PORT);
        props.setProperty("mail.smtp.socketFactory.class", CLASS);
        props.setProperty("mail.smtp.socketFactory.fallback", FALLBACK);
        props.setProperty("mail.smtp.socketFactory.port", PORT);

        log.info("prop - {}", props);

        Session session = Session.getInstance(props);
        session.setDebug(true);
        MimeMessage message = createMimeMessage(session, ACCOUNT, emailAddress, emailMessage);
        Transport transport = session.getTransport();
        transport.connect(ACCOUNT, PASSWORD);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容