美文网首页工作生活
线程池和异步方法

线程池和异步方法

作者: 荒天帝886 | 来源:发表于2019-07-01 14:04 被阅读0次

使用情景:

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

简要步骤

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();
    }

相关文章

  • Spring Boot 配置异步Async方法

    注解启动类 添加线程池配置 标注异步方法-不带返回值 标注异步方法-不带返回值 线程池的调用过程 核心线程池未满时...

  • 线程池和异步方法

    使用情景: 当处理某项较为耗时的操作时,一般需要新启动一个线程来完成。这样不影响主线程的工作。 简要步骤 1 先配...

  • 线程池糗百爬虫(四)

    1 线程池使用方法介绍 1 实例化线程池对象 2 把从发送请求,提取数据,到保存合并成一个函数,交给线程池异步执行...

  • 异步和线程池

    四种方式创建线程 1.通过Thread类创建线程 Thread01 thread = new Thread01()...

  • completableFuture使用

    1、runAsync(Runnable) 异步方法,默认线程池,无返回值2、runAsync(Runnable,E...

  • AsyncTask的使用及其原理

    概述 Android 已封装好的轻量级异步类。内置一个线程池用于异步任务,另一个线程池用于排队(实际不是线程池)。...

  • 线程池

    多线程使用:使用注解方式注入线程池进行异步任务,避免手动方式创建线程池

  • java并发基础-线程池

    线程池主要解决两个问题:当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接...

  • 三、AsyncTask

    1.什么是AsyncTask? 本质上就是封装了线程池和handler的异步框架 2.AsyncTask使用方法 ...

  • [C# 线程处理系列]专题二:线程池中的工作者线程

    目录: 一、上节补充 二、CLR线程池基础 三、通过线程池的工作者线程实现异步 四、使用委托实现异步 五、任务 一...

网友评论

    本文标题:线程池和异步方法

    本文链接:https://www.haomeiwen.com/subject/tsegcctx.html