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

惠州品牌网站建设公司哪里有网站关键词优化排名推荐

惠州品牌网站建设公司哪里有,网站关键词优化排名推荐,公司增加英文网站要怎么做,瓷砖网络推广培训一、线程池的作用 防止资源占用无限的扩张调用过程省去资源的创建和销毁所占用的时间 在上一节中,我们的一个异步任务打开了一个线程,完成后销毁。在高并发环境下,不断的分配新资源,可能导致系统资源耗尽。所以为了避免这个问题…

一、线程池的作用

  1. 防止资源占用无限的扩张
  2. 调用过程省去资源的创建和销毁所占用的时间

在上一节中,我们的一个异步任务打开了一个线程,完成后销毁。在高并发环境下,不断的分配新资源,可能导致系统资源耗尽。所以为了避免这个问题,我们为异步任务规划一个线程池。

二、定义线程池

在上述操作中,创建一个 线程池配置类TaskConfiguration ,并配置一个 任务线程池对象taskExecutor

@Configuration
public class TaskConfiguration {@Bean("taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10);executor.setMaxPoolSize(20);executor.setQueueCapacity(200);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix("taskExecutor-");executor.setRejectedExecutionHandler(new CallerRunsPolicy());return executor;}
}

上面我们通过使用 ThreadPoolTaskExecutor 创建了一个 线程池,同时设置了以下这些参数:

线程池属性属性的作用设置初始值
核心线程数线程池创建时候初始化的线程数10
最大线程数线程池最大的线程数,只有在缓冲队列满了之后,才会申请超过核心线程数的线程20
缓冲队列用来缓冲执行任务的队列200
允许线程的空闲时间当超过了核心线程之外的线程,在空闲时间到达之后会被销毁60秒
线程池名的前缀可以用于定位处理任务所在的线程池taskExecutor-
线程池对拒绝任务的处理策略这里采用CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在execute方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务CallerRunsPolicy
  • 创建 AsyncExecutorTask类,三个任务的配置和 AsyncTask 一样,不同的是 @Async 注解需要指定前面配置的 线程池的名称taskExecutor
@Component
public class AsyncExecutorTask extends AbstractTask {@Async("taskExecutor")public Future<String> doTaskOneCallback() throws Exception {super.doTaskOne();System.out.println("任务一,当前线程:" + Thread.currentThread().getName());return new AsyncResult<>("任务一完成");}@Async("taskExecutor")public Future<String> doTaskTwoCallback() throws Exception {super.doTaskTwo();System.out.println("任务二,当前线程:" + Thread.currentThread().getName());return new AsyncResult<>("任务二完成");}@Async("taskExecutor")public Future<String> doTaskThreeCallback() throws Exception {super.doTaskThree();System.out.println("任务三,当前线程:" + Thread.currentThread().getName());return new AsyncResult<>("任务三完成");}
}
  • 单元测试 用例中,注入 AsyncExecutorTask 对象,并在测试用例中执行 doTaskOne()doTaskTwo()doTaskThree() 三个方法。
@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncExecutorTaskTest {@Autowiredprivate AsyncExecutorTask task;@Testpublic void testAsyncExecutorTask() throws Exception {task.doTaskOneCallback();task.doTaskTwoCallback();task.doTaskThreeCallback();sleep(30 * 1000L);}
}

执行一下上述的 单元测试,可以看到如下结果:

开始做任务一
开始做任务三
开始做任务二
完成任务二,耗时:3905毫秒
任务二,当前线程:taskExecutor-2
完成任务一,耗时:6184毫秒
任务一,当前线程:taskExecutor-1
完成任务三,耗时:9737毫秒
任务三,当前线程:taskExecutor-3

执行上面的单元测试,观察到 任务线程池线程池名的前缀 被打印,说明 线程池 成功执行 异步任务

三、优雅地关闭线程池

由于在应用关闭的时候异步任务还在执行,导致类似 数据库连接池 这样的对象一并被 销毁了,当 异步任务 中对 数据库 进行操作就会出错。

解决方案如下,重新设置线程池配置对象,新增线程池 setWaitForTasksToCompleteOnShutdown()setAwaitTerminationSeconds() 配置:

@Bean("taskExecutor")
public Executor taskExecutor() {ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();executor.setPoolSize(20);executor.setThreadNamePrefix("taskExecutor-");executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(60);return executor;
}
  • setWaitForTasksToCompleteOnShutdown(true): 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,这样这些 异步任务销毁 就会先于 数据库连接池对象 的销毁。
  • setAwaitTerminationSeconds(60): 该方法用来设置线程池中 任务的等待时间,如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
http://www.yidumall.com/news/82645.html

相关文章:

  • 微网站页面菜单栏关键词搜索引擎排名查询
  • 网站备案 写共享可以吗网络营销能干什么工作
  • 电影网站源码系统情感网站seo
  • 北京P2P公司网站建设seo搜索引擎推广什么意思
  • 日本做暖视频在线观看网站灰色行业关键词优化
  • 网站内容更新慢原因优化设计高中
  • 网站平台做期货百度快照投诉
  • 个人开发网站软文推广是什么意思
  • 品质网站建设南宁seo产品优化服务
  • 做做网站app新手怎样推销自己的产品
  • 集团做网站方案制作包含哪些方面网站免费进入窗口软件有哪些
  • 中国纪检监察网站奶奶做女工百度指数需求图谱
  • 做微商自己建网站合适吗朋友圈推广怎么收费
  • 中国电信网站备案系统金华百度推广公司
  • 网站设计公司南京seo工资待遇怎么样
  • 天河网站建设多少钱西安排名seo公司
  • 深圳做网站的爱情独白在线优化工具
  • 新郑郑州网站建设产品软文案例
  • wordpress admin慢seo人员培训
  • 织梦网站内容自动更新个人网站制作流程
  • 安徽做手机网站培训机构好还是学校好
  • wordpress相册打造的视频弹出北京seo顾问推推蛙
  • 企业网站建设目的是什么百度怎么精准搜关键词
  • 歪歪小站 wordpress百度网盘app
  • 建设企业网站都需要啥头条新闻
  • 那个网站推作者百度收录api怎么提交
  • dede后台做两个网站快手秒赞秒评网站推广
  • 做任务 网站seo网站推广首页排名
  • 大型购物网站设计近10天的时事新闻
  • 零食网页制作素材长沙竞价优化