当前位置: 首页 > news >正文

网站排名优化系统盐城网站建设渠道合作

网站排名优化系统,盐城网站建设渠道合作,网站营销推广计划书,邢台太行中学收费在上一篇文章中#xff0c;我们使用多个线程隔离不同的异步任务#xff0c;这篇文章#xff0c;我们将围绕在Async的线程池的拒绝策略进行完善线程池的使用#xff0c;在我们例举案例之前#xff0c;我们先了解一下#xff1a; Async的拒绝策略用来解决什么问题#xff…在上一篇文章中我们使用多个线程隔离不同的异步任务这篇文章我们将围绕在Async的线程池的拒绝策略进行完善线程池的使用在我们例举案例之前我们先了解一下 Async的拒绝策略用来解决什么问题还有使用他究竟有什么好处 使用Async的拒绝策略可以解决异步任务线程池队列已满时的问题。当线程池队列已满时默认的拒绝策略是抛出RejectedExecutionException异常表示无法接受新的任务。而自定义拒绝策略可以提供一种灵活的方式来处理这种情况从而解决以下问题 避免任务丢失当线程池队列已满时如果没有合适的拒绝策略新的任务可能会被丢弃导致任务丢失。通过自定义拒绝策略你可以选择将任务丢弃、阻塞等待或者采取其他适当的处理方式以避免任务丢失。 控制任务流量拒绝策略可以帮助你控制任务的流量。当线程池队列已满时你可以选择拒绝执行新的任务从而控制任务的提交速率避免系统资源被过度消耗。这对于保护系统的稳定性和可靠性非常重要。 提供反馈机制自定义拒绝策略可以提供一种反馈机制告知任务提交者任务被拒绝执行的原因。通过捕获拒绝执行的异常或其他方式你可以根据需要记录日志、发送通知或采取其他适当的操作以便及时了解任务无法执行的情况。 在什么情况下我们才使用Async的拒绝策略? 任务队列满载当异步任务提交的速度超过线程池处理任务的速度时任务队列可能会被填满。这时新的任务无法加入队列就需要使用线程拒绝策略来处理这些被拒绝的任务。 任务执行资源有限当系统的资源如线程数有限并且无法扩展时可能会出现无法处理所有任务的情况。这时使用线程拒绝策略可以控制任务的提交速率避免资源被过度消耗。 任务处理能力不足当异步任务的处理能力不足以满足需求时可以使用线程拒绝策略来限制任务的提交以避免任务堆积和系统负载过高。 任务优先级管理有时你可能希望根据任务的优先级来管理任务的执行。通过自定义线程拒绝策略你可以根据任务的优先级进行选择性的拒绝执行以确保高优先级任务能够及时得到处理。 接下来我们看一个案例 我们先创建一个Spring Boot应用创建好我们的线程池配置。 EnableAsync SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}EnableAsyncConfigurationclass TaskPoolConfig {Beanpublic Executor taskExecutor1() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(2);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix(executor-1-);//后续在这里填写我们需要的拒绝策略return executor;}} }如上我们创建了一个核心线程数为2最大线程数为2缓冲队列长度为2假设我们有五个异步任务同时开始那么会造成什么情况呢 接着看吧我们使用Async注解实现一个任务 Slf4j Component public class AsyncTasks {public static Random random new Random();Async(taskExecutor1)public CompletableFutureString doTaskOne(String taskNo) throws Exception {log.info(开始任务{}, taskNo);long start System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long end System.currentTimeMillis();log.info(完成任务{}耗时{} 毫秒, taskNo, end - start);return CompletableFuture.completedFuture(任务完成);} }我们来编写一个测试用例来看看会发生什么结果 Slf4j SpringBootTest public class ApplicationTests {Autowiredprivate AsyncTasks asyncTasks;Testpublic void test2() throws Exception {long start System.currentTimeMillis();// 线程池1CompletableFutureString task1 asyncTasks.doTaskOne(1);CompletableFutureString task2 asyncTasks.doTaskOne(2);CompletableFutureString task3 asyncTasks.doTaskOne(3);CompletableFutureString task4 asyncTasks.doTaskOne(4);CompletableFutureString task5 asyncTasks.doTaskOne(5);// 一起执行CompletableFuture.allOf(task1, task2, task3, task4, task5).join();long end System.currentTimeMillis();log.info(任务全部完成总耗时 (end - start) 毫秒);} }2023-11-28 19:03:57.138 INFO 27916 --- [ executor-1-1] com.miaow.demo.AsyncTasks : 开始任务1 2023-11-28 19:03:57.138 INFO 27916 --- [ executor-1-2] com.miawo.demo.AsyncTasks : 开始任务2org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor5580d62f[Running, pool size 2, active threads 2, queued tasks 2, completed tasks 0]] did not accept task: java.util.concurrent.CompletableFuture$AsyncSupply17b6d426at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:324)at java.util.concurrent.CompletableFuture.asyncSupplyStage(CompletableFuture.java:1618)at java.util.concurrent.CompletableFuture.supplyAsync(CompletableFuture.java:1843)at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.doSubmit(AsyncExecutionAspectSupport.java:274)...at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Caused by: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.CompletableFuture$AsyncSupply17b6d426 rejected from java.util.concurrent.ThreadPoolExecutor5580d62f[Running, pool size 2, active threads 2, queued tasks 2, completed tasks 0]at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:321)... 76 more 我们来对报错日志进行分析 [java.util.concurrent.ThreadPoolExecutor5580d62f[Running, pool size 2, active threads 2, queued tasks 2, completed tasks 0]] did not accept task: 这段代码中我们可以明确的知道在我们的超过了执行线程 缓冲队列长度也就是 2 2 4 但是我们进来了5个线程所以我们的第五个线程就被拒绝了。 所以在默认情况之下我们的线程池的拒绝策略就是 当线程池队列满了那么我们的线程池就会丢弃这个任务并抛出异常。 OK,既然线程池中有默认的线程池拒绝策略那么我们可以对他配置吗考虑到实际开发过程中我们在有些任务场景中直接拒绝的策略一般都不太适用有的时候我们会选择丢掉之前开始执行但是并未完成的任务也可能会考虑丢掉刚刚开始执行但是没完成的任务反正有各种场景只要你线程没执行完毕我就可以丢弃你那么我们具体要怎么实现呢 线程池的拒绝策略是指当线程池无法接受新的任务时如何处理这些被拒绝的任务。在Spring框架中可以通过配置ThreadPoolTaskExecutor来设置线程池的拒绝策略。 ThreadPoolTaskExecutor提供了几种常见的拒绝策略 AbortPolicy默认当线程池无法接受新的任务时直接抛出RejectedExecutionException异常。 CallerRunsPolicy当线程池无法接受新的任务时将任务返回给调用者执行。也就是说如果线程池满了任务会在调用者的线程中执行。 DiscardPolicy当线程池无法接受新的任务时直接丢弃这个任务不做任何处理。 DiscardOldestPolicy当线程池无法接受新的任务时先丢弃最早加入队列的任务然后尝试再次提交新的任务。 来我们在代码中进行配置 ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();// AbortPolicy策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());// DiscardPolicy策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());// DiscardOldestPolicy策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());// CallerRunsPolicy策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); Lamba表达式的线程策略配置 executor.setRejectedExecutionHandler((r, executor1) - {// 拒绝策略的逻辑 }); 总的来说当异步任务的提交速度超过处理速度、资源有限或任务处理能力不足时使用Async的线程拒绝策略可以帮助你控制任务的提交速率避免任务堆积和系统负载过高。这样可以提高系统的稳定性和可靠性确保异步任务的顺利执行。
http://www.pierceye.com/news/180382/

相关文章:

  • 佛山 网站关键词优化trel域名
  • 哪家网站建设好大连房产网
  • 企业做推广哪些网站比较好兰州有做百度网站的吗
  • 网站建设和管理规则自己建网站的流程
  • 网站的前期推广广州网站建设加盟
  • 网站灰色 代码深圳的深圳的网站建设公司
  • 做电影采集网站需要多大vps安徽建设新工程信息网站
  • 中小企业网站制作化工厂网站建设
  • 电子政务网站建设出版社百度网页提交入口
  • 专业柳州网站建设哪家便宜淄博桓台网站建设定制
  • 网站建设投标标书企业网站建设销售前景
  • wordpress建站教程凌风wordpress 仪表盘 慢
  • 怎样给网站或者商品做推广关于建网站新闻
  • 上海 微信网站 建站一对一直播app
  • ppt模板免费下载网站哪个好克拉玛依市住房和建设局网站
  • 制作网站得多少钱交互设计留学
  • 理财网站免费建设经典重庆新闻论坛
  • 南京专业网站制作哪家好企业所得税交多少
  • 广西网站建设哪家好常熟做网站的
  • 礼品网站制作辽宁省建设部网站
  • 网站群的建设目标澧县网页设计
  • 邯郸网站建设在哪里网站建设yingkagou
  • 姜堰区网站建设企业公司网站制作
  • 目前做的比较好的法律网站有哪些兰州seo技术优化排名公司
  • wordpress网站接入qqwordpress调用二级分类目录
  • 自建站有哪些站点soho 网站建设
  • cms网站建设如果在网上接网站建设项目
  • 建设网站的重点与难点在于社区网站模版
  • 自己在线制作logo免费网站公司网页设计教程
  • 广西城乡建设网站一家企业如何做网站推广