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

制作公司网站价格中山 网站建设一条龙

制作公司网站价格,中山 网站建设一条龙,建网站要先建什么,app设计理念文章目录 前言1.需求分析2.实现概述3.具体实现3.1 统计完成任务数3.2 FutureTask3.3 CountDownLatch和CyclicBarrier 小结 前言 论是在项目开发中#xff0c;还是在面试中过程中#xff0c;总会被问到或使用到并发编程来完成项目中的某个功能。 例如某个复杂的查询#xf… 文章目录 前言1.需求分析2.实现概述3.具体实现3.1 统计完成任务数3.2 FutureTask3.3 CountDownLatch和CyclicBarrier 小结 前言 论是在项目开发中还是在面试中过程中总会被问到或使用到并发编程来完成项目中的某个功能。 例如某个复杂的查询无法使用一个查询语句来完成此功能此时我们就需要执行多个查询语句然后再将各自查询的结果组装之后返回给前端了那么这种场景下我们就必须使用线程池来进行并发查询了。 PS磊哥做的最复杂的查询总共关联了 21 张表在和产品及需求方的沟通多次沟通下才将查询的业务从 21 张表降到了至少要查询 12 张表非常难搞那么这种场景下是无法使用一个查询语句来实现的那么并发查询是必须要给安排上的。 1.需求分析 线程池的使用并不复杂麻烦的是如何判断线程池中的任务已经全部执行完了因为我们要等所有任务都执行完之后才能进行数据的组装和返回所以接下来我们就来看如何判断线程中的任务是否已经全部执行完 2.实现概述 判断线程池中的任务是否执行完的方法有很多比如以下几个 使用 getCompletedTaskCount() 统计已经执行完的任务和 getTaskCount() 线程池的总任务进行对比如果相等则说明线程池的任务执行完了否则既未执行完。 使用 FutureTask 等待所有任务执行完线程池的任务就执行完了。 使用 CountDownLatch 或 CyclicBarrier 等待所有线程都执行完之后再执行后续流程。 具体实现代码如下。 3.具体实现 3.1 统计完成任务数 通过判断线程池中的计划执行任务数和已完成任务数来判断线程池是否已经全部执行完如果计划执行任务数已完成任务数那么线程池的任务就全部执行完了否则就未执行完。 示例代码如下 private static void isCompletedByTaskCount(ThreadPoolExecutor threadPool) {while (threadPool.getTaskCount() ! threadPool.getCompletedTaskCount()) {} }以上程序执行结果如下 方法说明 getTaskCount()返回计划执行的任务总数。由于任务和线程的状态可能在计算过程中动态变化因此返回的值只是一个近似值。 getCompletedTaskCount()返回完成执行任务的总数。因为任务和线程的状态可能在计算过程中动态地改变所以返回的值只是一个近似值但是在连续的调用中并不会减少。 缺点分析 此判断方法的缺点是 getTaskCount() 和 getCompletedTaskCount() 返回的是一个近似值因为线程池中的任务和线程的状态可能在计算过程中动态变化所以它们两个返回的都是一个近似值。 3.2 FutureTask FutrueTask 的优势是任务判断精准调用每个 FutrueTask 的 get 方法就是等待该任务执行完如下代码所示 import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask;/*** 使用 FutrueTask 等待线程池执行完全部任务*/ public class FutureTaskDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {// 创建一个固定大小的线程池ExecutorService executor Executors.newFixedThreadPool(3);// 创建任务FutureTaskInteger task1 new FutureTask(() - {System.out.println(Task 1 start);Thread.sleep(2000);System.out.println(Task 1 end);return 1;});FutureTaskInteger task2 new FutureTask(() - {System.out.println(Task 2 start);Thread.sleep(3000);System.out.println(Task 2 end);return 2;});FutureTaskInteger task3 new FutureTask(() - {System.out.println(Task 3 start);Thread.sleep(1500);System.out.println(Task 3 end);return 3;});// 提交三个任务给线程池executor.submit(task1);executor.submit(task2);executor.submit(task3);// 等待所有任务执行完毕并获取结果int result1 task1.get();int result2 task2.get();int result3 task3.get();System.out.println(Do main thread.);} }以上程序的执行结果如下 3.3 CountDownLatch和CyclicBarrier CountDownLatch 和 CyclicBarrier 类似都是等待所有任务到达某个点之后再进行后续的操作如下图所示 CountDownLatch 使用的示例代码如下 public static void main(String[] args) throws InterruptedException {// 创建线程池ThreadPoolExecutor threadPool new ThreadPoolExecutor(10, 20,0, TimeUnit.SECONDS, new LinkedBlockingDeque(1024));final int taskCount 5; // 任务总数// 单次计数器CountDownLatch countDownLatch new CountDownLatch(taskCount); // ①// 添加任务for (int i 0; i taskCount; i) {final int finalI i;threadPool.submit(new Runnable() {Overridepublic void run() {try {// 随机休眠 0-4sint sleepTime new Random().nextInt(5);TimeUnit.SECONDS.sleep(sleepTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(String.format(任务%d执行完成, finalI));// 线程执行完计数器 -1countDownLatch.countDown(); // ②}});}// 阻塞等待线程池任务执行完countDownLatch.await(); // ③// 线程池执行完System.out.println();System.out.println(线程池任务执行完成); }代码说明以上代码中标识为 ①、②、③ 的代码行是核心实现代码其中 ① 是声明一个包含了 5 个任务的计数器 ② 是每个任务执行完之后计数器 -1 ③ 是阻塞等待计数器 CountDownLatch 减为 0表示任务都执行完了可以执行 await 方法后面的业务代码了。 以上程序的执行结果如下 缺点分析 CountDownLatch 缺点是计数器只能使用一次CountDownLatch 创建之后不能被重复使用。 CyclicBarrier 和 CountDownLatch 类似它可以理解为一个可以重复使用的循环计数器CyclicBarrier 可以调用 reset 方法将自己重置到初始状态CyclicBarrier 具体实现代码如下 public static void main(String[] args) throws InterruptedException {// 创建线程池ThreadPoolExecutor threadPool new ThreadPoolExecutor(10, 20,0, TimeUnit.SECONDS, new LinkedBlockingDeque(1024));final int taskCount 5; // 任务总数// 循环计数器 ①CyclicBarrier cyclicBarrier new CyclicBarrier(taskCount, new Runnable() {Overridepublic void run() {// 线程池执行完System.out.println();System.out.println(线程池所有任务已执行完);}});// 添加任务for (int i 0; i taskCount; i) {final int finalI i;threadPool.submit(new Runnable() {Overridepublic void run() {try {// 随机休眠 0-4sint sleepTime new Random().nextInt(5);TimeUnit.SECONDS.sleep(sleepTime);System.out.println(String.format(任务%d执行完成, finalI));// 线程执行完cyclicBarrier.await(); // ②} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}});} }以上程序的执行结果如下 方法说明 CyclicBarrier 有 3 个重要的方法 构造方法构造方法可以传递两个参数参数 1 是计数器的数量 parties参数 2 是计数器为 0 时也就是任务都执行完之后可以执行的事件方法。 await 方法在 CyclicBarrier 上进行阻塞等待当调用此方法时 CyclicBarrier 的内部计数器会 -1直到发生以下情形之一 在 CyclicBarrier 上等待的线程数量达到 parties也就是计数器的声明数量时则所有线程被释放继续执行。 当前线程被中断则抛出 InterruptedException 异常并停止等待继续执行。 其他等待的线程被中断则当前线程抛出 BrokenBarrierException 异常并停止等待继续执行。 其他等待的线程超时则当前线程抛出 BrokenBarrierException 异常并停止等待继续执行。 其他线程调用 CyclicBarrier.reset() 方法则当前线程抛出 BrokenBarrierException 异常并停止等待继续执行。 reset 方法使得CyclicBarrier回归初始状态直观来看它做了两件事 如果有正在等待的线程则会抛出 BrokenBarrierException 异常且这些线程停止等待继续执行。 将是否破损标志位 broken 置为 false。 优缺点分析 CyclicBarrier 从设计的复杂度到使用的复杂度都高于 CountDownLatch相比于 CountDownLatch 来说它的优点是可以重复使用只需调用 reset 就能恢复到初始状态缺点是使用难度较高。 小结 在实现判断线程池任务是否执行完成的方案中通过统计线程池执行完任务的方式实现方法 1以及实现方法 3CountDownLatch 或CyclicBarrier等统计都是“不记名”的只关注数量不关注具体对象所以这些方式都有可能受到外界代码的影响因此使用 FutureTask 等待具体任务执行完的方式是最推荐的判断方法。
http://wiki.neutronadmin.com/news/386827/

相关文章:

  • 苏州建设网站公司2023还能上的网站
  • 网站推广指标演艺公司
  • 做电子商务的网站网站建设流程渠道
  • 济南做网站公司排名wordpress后台首页增加论坛帖子
  • 网站集约化建设做法西安工程建设信息网站
  • 设计师可以做兼职的网站有哪些wordpress最热文章
  • 嘉兴手机建站模板专业手机网站建设
  • 做物流有哪些网站淘宝特价版
  • 客户如何找到做网站宣传的律师android软件开发工程师
  • 岳阳网站建设制作湖南平台网站建设公司
  • 做时尚网站取个名字请别人做网站如何交付
  • 用模板做网站wordpress 模板检测
  • 江门建设企业网站中英文微信网站开发
  • 网站站点建设中端口号的作用宁波做外贸网站
  • 新手如何做企业网站软件开发中需要哪些可行性分析
  • ytwzjs烟台网站建设品牌网上开店加盟网
  • 如何注册网站怎么注册龙岗网站建设公司网络服务
  • 怎么用自己的电脑做服务器发布网站wordpress 响应式主题
  • wordpress网站制作教程视频网站开发的基础知识
  • dedecms大气金融企业网站模板免费下载百度极速版app下载安装
  • iis网站属性怎么打开网站建设要不要工商注册
  • 品牌营销型网站建设策划婚纱网
  • 给小孩子做网站爱凡客
  • 公司网站建设应注意事项云主机与云电脑区别
  • 重庆新闻联播回放今天河北seo推广系统
  • 免费包装设计网站装修包工头接活网站
  • 订阅号做微网站360免费wifi手机版官方下载
  • 建设银网站wordpress增加页面
  • 上海网站建设领导品牌互联网上班是干嘛的
  • 共享互助医疗网站建设云南网页设计制作