工作生活

线程池和异步方法

2019-07-01  本文已影响0人  荒天帝886

使用情景:

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

简要步骤

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();
    }
上一篇 下一篇

猜你喜欢

热点阅读