springboot项目中使用线程池异步执行任务

线程池调度类:

package com.zhou.pool;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;

import java.util.concurrent.ScheduledThreadPoolExecutor;

@Slf4j
public class DefaultThreadPool extends ScheduledThreadPoolExecutor {

    @Getter
    @Setter
    private ThreadTrigger trigger = null;


    public DefaultThreadPool(int corePoolSize, int maximumPoolSize) {
        super(corePoolSize,new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
                new CallerRunsPolicy());
        setMaximumPoolSize(maximumPoolSize);
    }

    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        if(trigger != null){
            try{
                trigger.beforeExecute(t,r);
            }catch (Throwable e){
                log.error("[beforeExecute]trigger failed.",e);
            }

        }
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        if(trigger != null){
            try{
                trigger.afterExecute(r,t);
            }catch (Throwable e){
                log.error("[afterExecute]trigger failed.",e);
            }
        }
    }

    /**
     * 关闭线程池前执行
     */
    @Override
    protected void terminated() {
        if(trigger != null){
            try{
                trigger.beforeShutdown();
            }catch (Throwable e){
                log.error("[terminated]trigger failed.",e);
            }
        }
    }


}

调度监听器:

package com.zhou.pool;

/**
 * 全局监听器
 */
public interface ThreadTrigger {
    /**
     * 线程执行任务前执行
     */
    void beforeExecute(Thread t, Runnable r);
    /**
     * 执行任务后执行
     */
    void afterExecute(Runnable r, Throwable t);
    /**
     * 关闭线程池前执行
     */
    void beforeShutdown();
}
package com.zhou.pool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

/**
 * 线程池配置类
 */
@Slf4j
@Configuration
public class ThreadPoolConfig {

    @Bean("scheduledExecutorService")
    public DefaultThreadPool getPool(Environment environment){
        Integer poolSize = NumberTool.safeToInteger(environment.getProperty("investment.poolSize"), 3);
        Integer maxPoolSize = NumberTool.safeToInteger(environment.getProperty("investment.maxPoolSize"), 12);
        if(maxPoolSize < 3){
            maxPoolSize = 3;
        }
        if(maxPoolSize > 20){
            maxPoolSize = 20;
        }

        if(poolSize > 12){
            poolSize = 12;
        }
        if(poolSize > maxPoolSize){
            poolSize = maxPoolSize;
        }
        if(poolSize < 1){
            poolSize = 1;
        }

        log.info("线程池大小:poolSize={},maxPoolSize={}",poolSize,maxPoolSize);
        DefaultThreadPool pool = new DefaultThreadPool(poolSize, maxPoolSize);
        return pool;
    }

}

调度任务提交类:

package com.zhou.pool;

//import com.zhou.framework.common.spring.SpringFactory;
import lombok.extern.slf4j.Slf4j;

import java.util.TimerTask;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * @author lang.zhou
 */
@Slf4j
public class ThreadPoolManager {

    private static DefaultThreadPool pool = SpringFactory.getBean(DefaultThreadPool.class);
    /**
     * 延迟执行毫秒数
     */
    private static final long delay = 10L;

    /**
     * 异步执行任务
     * @param task 任务
     */
    public static void execute(Runnable task) {
        pool.schedule(task, delay, TimeUnit.MILLISECONDS);
    }

    /**
     * 异步执行任务
     * @param callable 任务
     */
    public static <T> Future<T> asyncRun(Callable<T> callable) {
        Future<T> scheduledFuture = pool.submit(callable);
        return scheduledFuture;
    }
    
}

调用:

ThreadPoolManager.execute(() -> {});

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot ,配置线程池执行定时任务可以通过以下步骤实现: 1. 在 Spring Boot 的配置文件,配置线程池的参数,如下所示: ```yaml spring: task: scheduling: pool: size: 5 ``` 其,`spring.task.scheduling.pool.size` 表示线程池的大小。 2. 创建一个定时任务使用 `@Scheduled` 注解标注要执行的方法,并使用 `@Async` 注解将任务放在异步线程池执行。例如: ```java @Component public class MyTask { @Async("taskExecutor") @Scheduled(fixedRate = 1000) public void doTask() { // 执行任务 } } ``` 其,`@Async("taskExecutor")` 表示将任务放在名为 `taskExecutor` 的线程池执行。 3. 在 Spring Boot ,可以使用 `ThreadPoolTaskExecutor` 类来创建线程池。例如: ```java @Configuration @EnableAsync public class TaskExecutorConfig { @Bean("taskExecutor") public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(25); return executor; } } ``` 其,`@EnableAsync` 注解用于开启异步执行。`taskExecutor` 方法返回一个 `ThreadPoolTaskExecutor` 对象,其设置了线程池的参数。 4. 在 Spring Boot 的启动类上添加 `@EnableScheduling` 注解,开启定时任务。例如: ```java @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 以上就是在 Spring Boot 配置线程池执行定时任务的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值