返回顶部
首页 > 资讯 > 后端开发 > JAVA >Springboot自带线程池
  • 700
分享到

Springboot自带线程池

springbootjavaspring 2023-09-14 13:09:25 700人浏览 薄情痞子
摘要

一: ThreadPoolTaskExecuto 1 ThreadPoolTaskExecutor线程池: ThreadPoolTaskExecutor是spring基于java本身的线程池ThreadPoolExecutor做的二次封装,

一: ThreadPoolTaskExecuto

1 ThreadPoolTaskExecutor线程池:

ThreadPoolTaskExecutor是spring基于java本身的线程池ThreadPoolExecutor做的二次封装,主要目的还是为了更加方便的在spring框架体系中使用线程池, 是Spring中默认的线程池

2 使用ThreadPoolTaskExecutor注入bean到ioc
  配置文件形式,Spring会自动配置

## 默认线程池配置,ThreadPoolTaskExecutor # 核心线程数spring.task.execution.pool.core-size=8  # 最大线程数spring.task.execution.pool.max-size=16# 空闲线程存活时间spring.task.execution.pool.keep-alive=60s# 是否允许核心线程超时spring.task.execution.pool.allow-core-thread-timeout=true# 线程队列数量spring.task.execution.pool.queue-capacity=100# 线程关闭等待spring.task.execution.shutdown.await-termination=falsespring.task.execution.shutdown.await-termination-period=# 线程名称前缀spring.task.execution.thread-name-prefix=demo_Thread

配置形式:

import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.Executor;import java.util.concurrent.ScheduledFuture;//@Configurationpublic class ThreadConfig {    @Value("${task.maxPoolSize}")    private int maxPoolSize;    //todo 其他的相关配置都可以通过配置文件中注入    @Bean("ThreadPoolTaskExecutor")    public Executor myAsync() {        final ThreadPoolTaskExecutor executor =                new ThreadPoolTaskExecutor();        executor.setMaxPoolSize(maxPoolSize);        //todo  其他参数设置        //初始化        executor.initialize();        return executor;    }}

3 创建线程后全部从ioc中获取线程池子

4 线程池处理流程:
(1) 查看核心线程池是否已满,不满就创建一条线程执行任务,核心线程数量已满就查看任务队列是否已满不满就将线程存储在任务队列中任务队列已满,就查看最大线程数量,不满就创建线程执行任务,已满就按照拒绝策略执行

(2) 拒绝策略:
CallerRunsPolicy():原来的线程执行
AbortPolicy():直接抛出异常
DiscardPolicy():直接丢弃
DiscardOldestPolicy():丢弃队列中最老的任

二: ThreadPoolTaskScheduler 

1 ThreadPoolTaskScheduler 定时调度任务线程池,处理异步任务

2 使用方式: 注入 ThreadPoolTaskScheduler的bean
 (1) 配置文件形式:..
 (2) 配置类形式:

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.ScheduledFuture;@Configurationpublic class ThreadPoolTaskSchedulerConfig {    @Bean    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {        final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();        //设置等待任务在关机时l候完成        threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);        //设置等待时间为60s        threadPoolTaskScheduler.setAwaitTerminationSeconds(60);        return threadPoolTaskScheduler;    }}

3  使用ThreadPoolTaskScheduler定时任务
 做普通线程池使用:
 submit(callable),需要执行结果
 submit(runnable),不需要执行结果


(1) 定时任务
 添加任务内容Runnable,设置执行周期Trigger/Date,Trigger表达式百度即可
 schedule(Runnable task,Trigger)
 schedule(Runnable task,Date)

(2) 指定间隔时间执行一次任务,时间间隔是前一次任务完成到下一次任务开始,单位毫秒
 scheduleWithFixedDelay(Runnable task,long delay)

(3) 固定频率执行任务,在任务开始后间隔一段时间执行新的任务,如果上次任务么执行完成,则等待上次任务执行完成后执行下次任务
 scheduleAtFixedRate(Runnable task,long delay)

(4) 定时任务取消:
 设置定时任务存储的集合,定时任务执行的结果为ScheduledFuture,将该对象存储到集合,通过在集合中获取ScheduledFuture对象.cancel(true)取消定时任务

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;import org.springframework.scheduling.support.CronTrigger;import org.springframework.stereotype.Service;import java.text.DateFORMat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.*;@Servicepublic class SchedulerService {    @Autowired    ThreadPoolTaskScheduler scheduler;        public void tesScheduler1() throws ExecutionException, InterruptedException {        //无返回值        final Future demo_scheduler1 = scheduler.submit(new Runnable() {            @Override            public void run() {                System.out.println("demo runnable scheduler");            }        });        //无返回值        final Future demo_scheduler2 = scheduler.submit(new Callable() {            @Override            public Object call() throws Exception {                System.out.println("demo callable  scheduler");                return "callable";            }        });        System.out.println("result:" + demo_scheduler2.get());    }        public void tesScheduler2() throws ParseException {        //CronTrigger表达式百度即可        scheduler.schedule(() -> {            System.out.println("定时任务");        }, new CronTrigger("0/1****?"));        //创建指定时间的日期        final Date date = new Date(2023, 3, 26, 21, 35);        final DateFormat format = new SimpleDateFormat();        final Date parse = format.parse("2023-03-26-21-26");        scheduler.schedule(() -> {            System.out.println(new Date());        }, parse);    }        public void tesScheduler3() {        scheduler.scheduleWithFixedDelay(() -> {            //todo        }, 300L);    }        public void tesScheduler4() {        scheduler.scheduleAtFixedRate(new FutureTask(new Callable() {                    @Override                    public String call() throws Exception {                        return null;                    }                }),                200);    }    //取消定时任务队列    public static ConcurrentMap map = new ConcurrentHashMap<>();    public void startTask(String k1) {        map.compute(k1, (k, v) -> {            if (map.containsKey(k)) return v;            map.put(k, v);            return v;        });    }} 

三 @Scheduled实现定时任务,注解开启定时任务

1 使用@EnableScheduled开启支持

2 @Scheduled标注方法
 (1)@Scheduled(fixedDelay=5000)延迟执行,5s后执行
 (2)@Scheduled(fixedRate=5000)定时执行,每隔五秒就进行执行
 (3)@Scheduled(corn="002**?") 自定义执行,corn表达式百度,常用这种执行方式,corn="002**?"每天凌晨两点开始执行定时任务

3 注意@Scheduled开启的任务是单线程的,容易阻塞
 (1) 在ioc中注入ThreadPoolTaskScheduler,则Scheduled就使用ThreadPoolTaskScheduler线程池,可以解决单线程阻塞问题
 (2) @Scheduled和@Async注解开启定时任务,在@Async("pool")中指定线程池,若是没有指定线程池会使用Spring的SimpleAsyncTaskExecutor线程池,这个线程池每次都会增加一个线程去执行任务,效率低下

四:Spring中的异步任务


1 @EnableAsync开启异步支持
2 @Async开启异步任务,指定线程池


注意:@Scheduled和@Async注解开启定时任务,在@Async("pool")中指定线程池,若是没有指定线程池会使用Spring的SimpleAsyncTaskExecutor线程池,这个线程池每次都会增加一个线程去执行任务,效率低下但是@Async单独开启异步任务,则使用的是默认的线程池,建议根据需求自定义线程池

注意:@Async的返回值只能为void或Future, 调用方和@Async不能在一个类中,否则不走aop

import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;@Servicepublic class AsyncService {    @Async    public void showThreadName1() {        //默认线程池        System.out.println(Thread.currentThread().getName());    }    @Async("myPool")//指定线程池    public void showThreadName2() {        System.out.println(Thread.currentThread().getName());    }}

 

五:献上一颗自java自定义线程池:

 @Bean("myPool")    public Executor executor(){       return new ThreadPoolExecutor(// 自定义一个线程池                1, // coreSize                2, // maxSize                60, // 60s                TimeUnit.SECONDS, new ArrayBlockingQueue<>(3) // 有界队列,容量是3个                , Executors.defaultThreadFactory()                , new ThreadPoolExecutor.AbortPolicy());    }

java自带的线程池,缓存,固定数量的,单线程的,定时的,,,,六七种,后面续上

一颗小蜗牛,慢慢总结慢慢爬e才能登峰........

来源地址:https://blog.csdn.net/weixin_45874214/article/details/130446654

--结束END--

本文标题: Springboot自带线程池

本文链接: https://lsjlt.com/news/407293.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Springboot自带线程池
    一: ThreadPoolTaskExecuto 1 ThreadPoolTaskExecutor线程池: ThreadPoolTaskExecutor是Spring基于java本身的线程池ThreadPoolExecutor做的二次封装,...
    99+
    2023-09-14
    spring boot java spring
  • Springboot自带线程池的实现
    目录一: ThreadPoolTaskExecuto二: ThreadPoolTaskScheduler 三 @Scheduled实现定时任务,注解开启定时任务四:Spri...
    99+
    2023-05-20
    Springboot自带线程池 Springboot自带线程池
  • Springboot自带线程池怎么实现
    本篇文章和大家了解一下Springboot自带线程池怎么实现。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。一: ThreadPoolTaskExecuto1 ThreadPoolTaskExecutor线程池:Threa...
    99+
    2023-07-06
  • springboot自帶线程池ThreadPoolTaskExecutor使用
    不管是阿里,还是华为java开发手册,都会有一条建议,就是让开发者不要使用Executors去创建线程池,而是使用构造函数ThreadPoolExecutor的方式来创建,并设置合理...
    99+
    2023-05-14
    springboot自帶线程池ThreadPoolTaskExecutor springboot ThreadPoolTaskExecutor
  • Python自带的线程池和进程池有什么用
    这篇文章主要介绍“Python自带的线程池和进程池有什么用”,在日常操作中,相信很多人在Python自带的线程池和进程池有什么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • SpringBoot实现线程池
    现在由于系统越来越复杂,导致很多接口速度变慢,这时候就会想到可以利用线程池来处理一些耗时并不影响系统的操作。 新建Spring Boot项目 1. ExecutorConfig....
    99+
    2024-04-02
  • SpringBoot线程池和Java线程池怎么使用
    这篇文章主要介绍“SpringBoot线程池和Java线程池怎么使用”,在日常操作中,相信很多人在SpringBoot线程池和Java线程池怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringB...
    99+
    2023-07-06
  • java自带的四种线程池是什么
    这篇文章主要讲解了“java自带的四种线程池是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java自带的四种线程池是什么”吧!java预定义的哪四种线程池?newSingleThrea...
    99+
    2023-06-30
  • java自带的四种线程池实例详解
    目录java预定义的哪四种线程池?四种线程池有什么区别?线程池有哪几个重要参数?如何自定义线程池总结java预定义的哪四种线程池? newSingleThreadExexcutor:...
    99+
    2024-04-02
  • springboot如何创建线程池
    这篇文章主要介绍springboot如何创建线程池,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot创建线程池两种方式1.使用static代码块创建这样的方式创建的好处是当代码用到线程池的时候才会初始...
    99+
    2023-06-22
  • SpringBoot 项目中创建线程池
     前言: 前两天做项目的时候,想提高一下插入表的性能优化,因为是两张表,先插旧的表,紧接着插新的表,一万多条数据就有点慢了 后面就想到了线程池ThreadPoolExecu...
    99+
    2024-04-02
  • springboot使用线程池(ThreadPoolTaskExecutor)示例
    目录线程池创建线程池参数线程池测试1(核心线程数量)线程池测试2(当核心线程数量和最大线程数量不够时)总结代码仓库:gitee 线程池创建 @Configuration @Enab...
    99+
    2024-04-02
  • SpringBoot线程池和Java线程池的使用和实现原理解析
    目录SpringBoot线程池和Java线程池的用法和实现原理使用默认的线程池方式一:通过@Async注解调用方式二:直接注入 ThreadPoolTaskExecutor...
    99+
    2023-05-15
    SpringBoot线程池和Java线程池用法 SpringBoot线程池
  • Springboot 配置线程池创建线程及配置 @Async 异步操作线程池详解
    目录前言一、创建一个Springboot Web项目二、新建ThreadPoolConfig三、新建controller测试四、演示结果前言 众所周知,创建显示线程和直接使用未配置的...
    99+
    2024-04-02
  • Java多线程 自定义线程池详情
    主要介绍: 1.任务队列 2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列) 3.init( min ) 4.active 5.max ...
    99+
    2024-04-02
  • springboot默认线程池怎么配置
    在Spring Boot中,可以通过配置文件(application.properties或application.yml)来配置默...
    99+
    2023-10-27
    springboot
  • python自定义线程池控制线程数量
    1.自定义线程池 import threading import Queue import time queue = Queue.Queue() def put_data_in_queue(): for i in xrang...
    99+
    2023-01-31
    线程 自定义 数量
  • springboot为异步任务规划自定义线程池的实现
    目录一、Spring Boot任务线程池二、自定义线程池三、优雅地关闭线程池一、Spring Boot任务线程池 线程池的作用 防止资源占用无限的扩张调用过程省去资源的创建和销毁所占...
    99+
    2024-04-02
  • Springboot 如何使用@Async整合线程池
    Springboot @Async整合线程池 开篇咱们先来聊聊线程池这个概念,或者说为什么要使用线程池;简言之,充分利用cpu资源,提高程序执行时间,但是相反,线程池异常提示、主线程...
    99+
    2024-04-02
  • springboot使用线程池方法是什么
    本篇内容主要讲解“springboot使用线程池方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot使用线程池方法是什么”吧!线程池创建@Configuration@En...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作