spring boot 定义线程池多线程执行任务

一. 定义线程池

将线程池创建到application启动类中

@SpringBootApplication
@EnableScheduling   // 定时任务
public class AskApplication {
    private static final Logger logger = LoggerFactory.getLogger(AskApplication.class);
    public static void main(String[] args) {
        SpringApplication.run(AskApplication.class, args);
        logger.info("========================启动完毕========================");
    }

//    @Bean(initMethod = "init" , destroyMethod = "del")
//    public BeanService beanService() {
//        return new BeanService();
//    }

    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        // 创建一个 队列
        LinkedBlockingQueue queue = new LinkedBlockingQueue<>(10);

        // 核心线程数 最大线程数  非核心线程存活时间  TimeUnit时间单位   Queue超过线程数存储到什么队列中
        ThreadPoolExecutor threadPoolExecutor =
                new ThreadPoolExecutor(50, 100, 3000L, TimeUnit.SECONDS, queue);

        // 设置线程工程,自定义一下
        threadPoolExecutor.setThreadFactory(new ThreadFactory() {
            @Override
            public Thread newThread(@NotNull Runnable r) {
                // ThreadFactory工厂 , 可以对 线程任务分发线程,进行一些特定行为:取名称..等
                return new Thread(r , "任务class名称:---" + r.getClass().getName());
            }
        });

        // 设置内存饱满处理机制
        // hreadPoolExecutor.AbortPolicy() 是一个内部类 , 所以这个new 是创建的 AbortPolicy 对象
        threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

        // 创建线程池
        return threadPoolExecutor;
    }

}

二. 使用

  1. 定义线程池
@Autowired
private ThreadPoolExecutor threadPoolExecutor;
  1. 使用execute()调用线程
  threadPoolExecutor.execute(new InsertRunnable());
  1. 线程类实现Runable
public class InsertRunnable implements Runnable {
 // 线程中的对象需要手动从spring容器中获取
 private static final service类 对象名称 = (service类)AppBean.getBean(对象名称);
}
  1. 手动获取bean对象的工具类
public class AppBean implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    /**
     * @Override
     * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) <BR>
     * Method name: setApplicationContext <BR>
     * Description: please write your description <BR>
     * Remark: <BR>
     * @param
     * @throws BeansException  <BR>
     */
    @Override
    public void setApplicationContext(ApplicationContext appContext) throws BeansException {
        applicationContext = appContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name){
        return applicationContext.getBean(name);
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值