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

学习如何做网站中国跨境电商平台

学习如何做网站,中国跨境电商平台,苏州科技网站建设,温州乐清最新消息文章目录 1 问题背景2 前言3 4种常用的方法4 代码4.1 isTerminated()4.2 线程池的任务总数是否等于已执行的任务数4.3 CountDownLatch计数器4.4 CyclicBarrier计数器 1 问题背景 真实生产环境的电商项目#xff0c;常使用线程池应用于执行大批量操作达到高性能的效果。应用场景… 文章目录 1 问题背景2 前言3 4种常用的方法4 代码4.1 isTerminated()4.2 线程池的任务总数是否等于已执行的任务数4.3 CountDownLatch计数器4.4 CyclicBarrier计数器 1 问题背景 真实生产环境的电商项目常使用线程池应用于执行大批量操作达到高性能的效果。应用场景有批量补偿修正数据库历史数据、定时批量执行业务逻辑涉及到百万级数据、批量初始化新业务的数据等等。用到线程池必须要知道任务是否执行完了才能进行下一步业务操作。今天总结归纳4种常用的方法判断线程池是否执行完所有任务 2 前言 先给出解决方案文末再贴出详细代码 参考自面试突击35如何判断线程池已经执行完所有任务了 3 4种常用的方法 线程池提供的isTerminated()方法。缺点是需要调用shutdown()关闭线程池判断线程池的任务总数是否等于已执行的任务数。优点是无需关闭线程池。缺点是两个数值都是动态计算的只是一个近似值CountDownLatch计数器。写法很优雅且无需关闭线程池但它的缺点是只能使用一次CountDownLatch 创建之后不能被重复使用CyclicBarrier计数器。和 CountDownLatch 类似它可以理解为一个可以重复使用的循环计数器CyclicBarrier 可以调用reset()将自己重置到初始状态 4 代码 4.1 isTerminated() Slf4j public class IsTerminatedDemo {private static final int BLOCKING_QUEUE_CAPACITY 100;private static final DateTimeFormatter FORMATTER DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss:SSS);/*** 使用isTerminated判断线程池是否执行完任务缺点是要关闭线程池** param args*/public static void main(String[] args) {ThreadPoolExecutor threadPool new ThreadPoolExecutor(10,10,10 * 60,TimeUnit.SECONDS,new ArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY),new DefaultThreadFactory(complete_thread_pool),new ThreadPoolExecutor.AbortPolicy());// 添加任务for (int i 0; i 5; i) {int finalI i;threadPool.submit(() - {// 随机休眠int r new Random().nextInt(5);try {Thread.sleep(r);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info(Task NO.{} finish., finalI);});}threadPool.shutdown();// 判断线程池是否执行完所有任务前提是要执行shutdownwhile (!threadPool.isTerminated()) {log.info({}: ThreadPool handleing task., LocalDateTime.now().format(FORMATTER));}log.info(All tasks have been finished!);} }4.2 线程池的任务总数是否等于已执行的任务数 Slf4j public class GetCompletedTaskCountDemo {private static final int BLOCKING_QUEUE_CAPACITY 100;private static final DateTimeFormatter FORMATTER DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss:SSS);/*** 判断线程池是否执行完所有任务如果计划执行任务数已完成任务数那么线程池的任务就全部执行完了。* 优点是无需关闭线程池* 缺点是 getTaskCount() 和 getCompletedTaskCount() 返回的是一个近似值因为线程池中的任务和线程的状态可能在计算过程中动态变化所以它们两个返回的都是一个近似值** param args*/public static void main(String[] args) {ThreadPoolExecutor threadPool new ThreadPoolExecutor(10,10,10 * 60,TimeUnit.SECONDS,new ArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY),new DefaultThreadFactory(complete_thread_pool),new ThreadPoolExecutor.AbortPolicy());// 添加任务for (int i 0; i 5; i) {int finalI i;threadPool.submit(() - {// 随机休眠int r new Random().nextInt(5);try {Thread.sleep(r);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info(Task NO.{} finish., finalI);});}// 判断线程池是否执行完所有任务如果计划执行任务数已完成任务数那么线程池的任务就全部执行完了。// 优点是无需关闭线程池// 缺点是 getTaskCount() 和 getCompletedTaskCount() 返回的是一个近似值因为线程池中的任务和线程的状态可能在计算过程中动态变化所以它们两个返回的都是一个近似值while (threadPool.getTaskCount() ! threadPool.getCompletedTaskCount()) {log.info({}: ThreadPool handleing task., LocalDateTime.now().format(FORMATTER));}log.info(All tasks have been finished!);} }4.3 CountDownLatch计数器 Slf4j public class CountDownLatchDemo {private static final int BLOCKING_QUEUE_CAPACITY 100;private static final DateTimeFormatter FORMATTER DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss:SSS);/*** 写法很优雅且无需关闭线程池但它的缺点是只能使用一次CountDownLatch 创建之后不能被重复使用* 也就是说 CountDownLatch 可以理解为只能使用一次的计数器** param args*/public static void main(String[] args) {ThreadPoolExecutor threadPool new ThreadPoolExecutor(10,10,10 * 60,TimeUnit.SECONDS,new ArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY),new DefaultThreadFactory(complete_thread_pool),new ThreadPoolExecutor.AbortPolicy());int taskCount 5;CountDownLatch cdl new CountDownLatch(taskCount);// 添加任务for (int i 0; i taskCount; i) {int finalI i;threadPool.submit(() - {// 随机休眠int r new Random().nextInt(5);try {Thread.sleep(r);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info(Task NO.{} finish., finalI);// 线程执行完计数器减1cdl.countDown();});}log.info({}: ThreadPool handleing task., LocalDateTime.now().format(FORMATTER));try {// 阻塞等待所有线程执行完任务cdl.await();} catch (InterruptedException e) {throw new RuntimeException(e);}log.info(All tasks have been finished!);} }4.4 CyclicBarrier计数器 Slf4j public class CyclicBarrierDemo {private static final int BLOCKING_QUEUE_CAPACITY 100;private static final DateTimeFormatter FORMATTER DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss:SSS);/***和 CountDownLatch 类似它可以理解为一个可以重复使用的循环计数器CyclicBarrier 可以调用 reset 方法将自己重置到初始状态** param args*/public static void main(String[] args) {ThreadPoolExecutor threadPool new ThreadPoolExecutor(10,10,10 * 60,TimeUnit.SECONDS,new ArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY),new DefaultThreadFactory(complete_thread_pool),new ThreadPoolExecutor.AbortPolicy());int taskCount 5;CyclicBarrier cb new CyclicBarrier(taskCount, () - log.info(log from CyclicBarrier, all tasks of ThreadPool have been finished));// 添加任务for (int i 0; i taskCount; i) {int finalI i;threadPool.submit(() - {// 随机休眠int r new Random().nextInt(5);try {Thread.sleep(r);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info(Task NO.{} finish., finalI);// 阻塞等待try {cb.await();} catch (Exception e) {throw new RuntimeException(e);}});}log.info(All tasks have been finished!);} }
http://www.hkea.cn/news/14421094/

相关文章:

  • wordpress做的网站做视频用的网站有哪些
  • 登陆建设银行网站异常公司软件网站建设
  • 建立一个公司的网站seo 论坛
  • 百度搜不倒公司网站用php做的网站用什么数据库
  • 网站设计 app开发义乌的论坛网站建设
  • 自己做的小网站wordpress主题git
  • 婚庆公司网站建设策划书wordpress 老伍
  • 网站点击量软件高端网站建设服务商上海雍熙
  • 类似于建设通的网站个人域名能做网站吗
  • 南平市住房和城乡建设局网站ppt做的好的有哪些网站有哪些
  • 论坛网站设计江苏市场监督管理局旗舰店
  • 网站建设空间成都网站建设全平台
  • 做微商去哪个网站推广网站建设的目的及功能定位
  • 缪斯设计网站网络营销推广策划方案书
  • 附近建网站公司郑州网站建设灵秀
  • 区块链技术网站开发站长工具查询视频
  • 用境外服务器做网站网站后台设置
  • 建设大型购物网站培训机构咨询
  • 对网站外部的搜索引擎优化小程序代理设置
  • 太原做企业网站的网站建设竞标
  • 七里港网站建设建设完网站成功后需要注意什么
  • 沈阳企业网站开发wordpress数据库调用
  • 做网站制作利润有多少建设刷会员网站
  • 哈尔滨制作手机网站wordpress购物模版
  • 郏县网站制作哪家公司好福州的网站建设
  • 上传网站到百度周村网站建设yx718
  • 开发网站需要注意企业开发网站用什么技术
  • php旅游网站开发小结网站搜索显示图片
  • 电子商务网站建设评价写好网页怎么建成网站
  • 网站中的公司地址怎么做wordpress固定链接 404 nginx