推广 热搜: 二手  净利2626万  北京  二手车  SMM废铜现货交易日评  企业  全国  汽车  三星  公司 

Springboot自带线程池如何达成

   日期:2024-06-17     来源:www.ydg4.com    作者:二手网    浏览:740    评论:0    
核心提示:[db:简介]
一: 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

配置形式:

importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;importorg.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.ConcurrentMap;importjava.util.concurrent.Executor;importjava.util.concurrent.ScheduledFuture;//@ConfigurationpublicclassThreadConfig{@Value(${task.maxPoolSize})privateintmaxPoolSize;//todo其他的有关配置都可以通过配置文件中注入@Bean(ThreadPoolTaskExecutor)publicExecutormyAsync(){finalThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();executor.setMaxPoolSize(maxPoolSize);//todo其他参数设置//初始化executor.initialize();returnexecutor;}}

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

4 线程池处置步骤:

(1) 查询核心线程池是不是已满,不满就创建一条线程实行任务,核心线程数目已满就查询任务队列是不是已满不满就将线程存储在任务队列中任务队列已满,就查询最大线程数目,不满就创建线程实行任务,已满就根据拒绝方案实行

(2) 拒绝方案:

CallerRunsPolicy():原来的线程实行

AbortPolicy():直接抛出异常

DiscardPolicy():直接遗弃

DiscardOldestPolicy():遗弃队列中最老的任

二: ThreadPoolTaskScheduler

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

2 用方法: 注入 ThreadPoolTaskScheduler的bean

(1) 配置文件形式:..
(2) 配置类形式:

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.ConcurrentMap;importjava.util.concurrent.ScheduledFuture;@ConfigurationpublicclassThreadPoolTaskSchedulerConfig{@BeanpublicThreadPoolTaskSchedulerthreadPoolTaskScheduler(){finalThreadPoolTaskSchedulerthreadPoolTaskScheduler=newThreadPoolTaskScheduler();//设置等待任务在关机时l候完成threadPoolTaskScheduler.setWaitForTasksToCompleteonShutdown(true);//设置等待时间为60sthreadPoolTaskScheduler.setAwaitTerminationSeconds(60);returnthreadPoolTaskScheduler;}}

3 用ThreadPoolTaskScheduler定时任务

做普通线程池用:

submit(callable),需要实行结果

submit(runnable),无需实行结果

(1) 定时任务

添加任务内容Runnable,设置实行周期Trigger/Date,Trigger表达式百度即可

schedule(Runnabletask,Trigger)schedule(Runnabletask,Date)

(2) 指定间隔时间实行一次任务,时间间隔是前一次任务完成到下一次任务开始,单位毫秒

scheduleWithFixedDelay(Runnabletask,longdelay)

(3) 固定频率实行任务,在任务开始后间隔一段时间实行新的任务,假如上次任务么实行完成,则等待上次任务实行完成后实行下次任务

scheduleAtFixedRate(Runnabletask,longdelay)

(4) 定时任务取消:

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

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;importorg.springframework.scheduling.support.CronTrigger;importorg.springframework.stereotype.Service;importjava.text.DateFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.concurrent.*;@ServicepublicclassSchedulerService{@AutowiredThreadPoolTaskSchedulerscheduler;publicvoidtesScheduler1()throwsExecutionException,InterruptedException{//无返回值finalFuture?demo_scheduler1=scheduler.submit(newRunnable(){@Overridepublicvoidrun(){System.out.println(demorunnablescheduler);}});//无返回值finalFuture?demo_scheduler2=scheduler.submit(newCallableObject(){@OverridepublicObjectcall()throwsException{System.out.println(democallablescheduler);returncallable;}});System.out.println(result:+demo_scheduler2.get());}publicvoidtesScheduler2()throwsParseException{//CronTrigger表达式百度即可scheduler.schedule(()-{System.out.println(定时任务);},newCronTrigger(0/1****?));//创建指定时间的日期finalDatedate=newDate(2023,3,26,21,35);finalDateFormatformat=newSimpleDateFormat();finalDateparse=format.parse(2023-03-26-21-26);scheduler.schedule(()-{System.out.println(newDate());},parse);}publicvoidtesScheduler3(){scheduler.scheduleWithFixedDelay(()-{//todo},300L);}publicvoidtesScheduler4(){scheduler.scheduleAtFixedRate(newFutureTaskString(newCallableString(){@OverridepublicStringcall()throwsException{returnnull;}}),200);}//取消定时任务队列publicstaticConcurrentMapString,ScheduledFuturemap=newConcurrentHashMap();publicvoidstartTask(Stringk1){map.compute(k1,(k,v)-{if(map.containsKey(k))returnv;map.put(k,v);returnv;});}}三 @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;

importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Service;@ServicepublicclassAsyncService{@AsyncpublicvoidshowThreadName1(){//默认线程池System.out.println(Thread.currentThread().getName());}@Async(myPool)//指定线程池publicvoidshowThreadName2(){System.out.println(Thread.currentThread().getName());}}五:献上一颗自java自概念线程池:

@Bean(myPool)publicExecutorexecutor(){returnnewThreadPoolExecutor(//自概念一个线程池1,//coreSize2,//maxSize60,//60sTimeUnit.SECONDS,newArrayBlockingQueue(3)//有界队列,容量是3个,Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());}

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

 
标签: Spring boot
打赏
 
更多>同类二手资讯
0相关评论

热门推荐
推荐图文
推荐二手资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  免责声明  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报