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

重庆市住建厅网站seo外包靠谱

重庆市住建厅网站,seo外包靠谱,网站标题关键词堆砌,织梦网站地图制作教程文章目录 核心思想:组队出游,人到齐了才出发 🚌最简单易懂的代码示例代码解析运行效果分析CyclicBarrier vs CountDownLatch 的关键区别CyclicBarrier在业务系统里面通常有什么常用的应用场景核心应用模式1. 数据并行处理与ETL(最…

文章目录

      • 核心思想:组队出游,人到齐了才出发 🚌
      • 最简单易懂的代码示例
      • 代码解析
      • 运行效果分析
      • `CyclicBarrier` vs `CountDownLatch` 的关键区别
      • CyclicBarrier在业务系统里面通常有什么常用的应用场景
      • 核心应用模式
      • 1. 数据并行处理与ETL(最经典)
      • 2. 模拟高并发测试
      • 3. 多线程数据计算与合并
      • 4. 游戏服务器中的多玩家同步
      • 总结

核心思想:组队出游,人到齐了才出发 🚌

想象一下,您和几个朋友约好一起去旅游。大家从各自的家里出发,约定在火车站门口集合。CyclicBarrier 就好比是这个“集合点”。

  • 规则:必须所有人都到达火车站门口后,大家才能一起进站上车。先到的人必须在门口等着,直到最后一个人到达。
  • CyclicBarrier barrier = new CyclicBarrier(3);
    • 这等于约定了这次出游的小队有 3个人。这个 3 就是需要到达“栅栏”(Barrier)的线程数量。
  • barrier.await(); (等待)
    • 每个朋友(线程)到达火车站门口时,就调用一次这个方法。
    • 这个方法的意思是:“我到了,我开始等待其他人。” 然后这个线程就会被阻塞
  • 触发开栅
    • 当第3个朋友(最后一个线程)也到达并调用 await() 时,“集结”条件达成!
    • 栅栏会“打开”,所有之前在 await() 处等待的线程会被同时唤醒,然后大家一起继续执行后面的任务(比如进站)。
  • 循环使用 (Cyclic)
    • 最关键的是,这个栅栏是可以重复使用的。比如大家进站后,又可以约定在“检票口”作为下一个集合点,再次使用同一个 CyclicBarrier 等待所有人检票后一起上车。

最简单易懂的代码示例

下面我们就用代码来模拟 3个朋友约定集合 的场景。我们还会用到 CyclicBarrier 的一个高级功能:当最后一个人到达时,可以指定一个额外的任务(比如由最后一个人高喊“人齐了,出发!”)。

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SimpleCyclicBarrierDemo {public static void main(String[] args) {// 1. 创建一个 CyclicBarrier//    参数1: 参与的线程数量(小队人数为3)//    参数2: 当最后一个线程到达栅栏时,要执行的任务(可选)final int teamSize = 3;final CyclicBarrier barrier = new CyclicBarrier(teamSize, () -> {// 这个任务会由最后一个到达栅栏的线程来执行System.out.println("\n*** 所有人都到齐了!由我(最后到达者)来宣布:出发! ***\n");});// 创建一个线程池来管理我们的朋友线程ExecutorService executor = Executors.newFixedThreadPool(teamSize);System.out.println("--- 3个朋友各自从家里出发 ---");// 2. 模拟3个朋友出发for (int i = 0; i < teamSize; i++) {final String friendName = "朋友-" + (i + 1);executor.submit(() -> {try {// 模拟从家里到集合点的耗时int travelTime = new Random().nextInt(5000) + 1000; // 随机1-6秒System.out.println("[" + friendName + "] 出发了,大概需要 " + travelTime / 1000 + " 秒...");Thread.sleep(travelTime);System.out.println(">>> [" + friendName + "] 到达集合点,开始等待其他人...");// 3. 关键!调用 await() 表示自己已到达,并开始等待//    线程会在这里被阻塞,直到所有3个线程都调用了 await()barrier.await();// --- 当所有人都到达后,线程会从 await() 返回,继续执行 ---System.out.println("<<< [" + friendName + "] 跟随大部队一起出发!");} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}});}// 关闭线程池executor.shutdown();}
}

在这里插入图片描述

代码解析

  1. new CyclicBarrier(3, ...): 创建了一个需要3个线程“报到”的栅栏。同时还指定了一个“栅栏任务”,这个任务会在第3个线程报到时,由那个线程顺便完成。
  2. barrier.await(): 这是每个线程的“报到点”。先到的线程会在这里停下(阻塞),耐心等待后到的同伴。
  3. barrierAction (第二个参数): 当最后一个(第3个)线程调用await()时,它不会立刻阻塞,而是先去执行这个我们预设好的任务(打印“所有人都到齐了…”),执行完之后,栅栏才会打开,所有线程(包括它自己)才能继续前进。

运行效果分析

当你运行程序时,你会看到:

  1. 3个朋友会不按顺序地、在不同时间点打印“到达集合点…”。
  2. 先到的1、2个朋友在打印完这句话后就不会有任何输出了,因为它们被 await() 阻塞了。
  3. 直到最后一个朋友也打印了“到达集合点…”,并调用了 await() 后,你会立刻看到:
    a. 首先打印出 *** 所有人都到齐了!... *** 这条消息(由最后到达的线程执行)。
    b. 紧接着,3个线程会几乎同时打印出 <<< [朋友-X] 跟随大部队一起出发! 的信息。

CyclicBarrier vs CountDownLatch 的关键区别

特性CyclicBarrier (循环栅栏)CountDownLatch (倒数门闩)
作用对象一组线程相互等待一个或多个线程等待其他线程
关系朋友之间,地位平等老板和员工,一个等多个
可重用性可循环使用。所有线程通过后,计数器重置,可用于下一轮集合。一次性。计数减到0后就失效了,无法重置。
功能功能更强大,可以附加一个barrierAction任务。功能相对简单。

简单总结CountDownLatch 是一个线程等其他所有线程完事,而 CyclicBarrier 是所有线程互相等,等齐了再一起干下一件事。

CyclicBarrier在业务系统里面通常有什么常用的应用场景

好的,这个问题非常好!从学习一个工具的API到理解它在真实业务系统中的价值,是成为一个优秀工程师的关键一步。

CyclicBarrier 的核心是“让一组线程相互等待,直到所有线程都到达一个公共的屏障点,然后再一起继续执行”。基于这个特性,它在业务系统中有几个非常经典和常用的应用场景。


核心应用模式

所有场景都可以归结为一个模式:将一个大任务拆分成多个独立的子任务,让多个线程并行处理,但在某些关键的“同步点”(屏障),这些线程必须等待彼此,直到所有线程都到达这个点,然后才能一起进入下一个阶段。

下面是几个具体的业务场景:

1. 数据并行处理与ETL(最经典)

这是 CyclicBarrier 最常见的用途,尤其是在大数据和数据仓库领域。想象一下,你需要处理一个巨大的数据文件(例如,几千万条用户数据),整个过程分为三个阶段:

  1. 数据读取(Read): 从文件中读取数据到内存。
  2. 数据处理(Process): 对内存中的数据进行清洗、转换、计算。
  3. 数据写入(Write): 将处理好的数据写入到数据库。

为了提高效率,你可以启动多个线程,每个线程负责处理文件的一部分。但这里的关键是,必须等所有线程都完成了上一个阶段,才能一起开始下一个阶段

  • 场景: 必须等所有线程都读取完毕,数据才算完整,才能开始处理
  • 场景: 必须等所有线程都处理完毕,才能开始写入,以保证数据的一致性。

CyclicBarrier 在这里的作用:
就像一个阶段性的流水线

  • 创建一个 CyclicBarrier,参与方数量就是你的线程数。
  • 每个线程完成自己的数据读取后,调用 barrier.await()
  • 当最后一个线程也完成读取并调用await()后,所有线程被唤醒,一起进入数据处理阶段。
  • 处理完后,再次调用 barrier.await(),等待所有同伴,然后一起进入数据写入阶段。
  • CyclicBarrier的“可循环使用”特性在这里得到了完美体现。
// 伪代码
void processData() {// 阶段1:读取数据readMyChunk();barrier.await(); // 等待所有线程读完// 阶段2:处理数据processMyChunk();barrier.await(); // 等待所有线程处理完// 阶段3:写入数据writeMyChunk();
}

2. 模拟高并发测试

在做性能压测时,我们常常需要模拟“在同一瞬间,有大量用户请求同时到达服务器”的场景,以测试系统的瞬时承载能力。

如果只是简单地用一个 for 循环启动几百个线程,那么这些线程的启动时间会有先后,无法做到真正的“同时并发”。

CyclicBarrier 在这里的作用:
就像一个赛跑的起跑线

  1. 创建一个 CyclicBarrier,参与方数量就是并发用户数(比如500)。
  2. 启动500个线程,每个线程模拟一个用户。
  3. 每个线程在真正发起HTTP请求之前,先执行各自的准备工作(比如准备参数、建立连接等)。
  4. 准备工作完成后,每个线程都调用 barrier.await()
  5. 此时,所有500个线程都会在“起跑线”上被阻塞,等待发令枪。
  6. 当最后一个(第500个)线程也准备好并调用await()时,栅栏打开,所有500个线程会几乎在同一时刻被唤醒,然后同时向服务器发起请求,从而达到了模拟瞬时高并发的目的。

3. 多线程数据计算与合并

在科学计算或金融分析等领域,一个复杂的计算任务可以被分解。例如,计算一个大矩阵,可以把矩阵切成好几块,分给不同线程计算。

  • 场景:每个线程计算完自己的那一小块后,需要用同伴们计算出的结果来计算下一轮的迭代值。
  • CyclicBarrier的作用:确保所有线程都完成了当前轮次的计算,并将结果保存在一个共享位置后,大家才能一起进入下一轮迭代。这保证了每一轮迭代的初始数据都是完整和同步的。

4. 游戏服务器中的多玩家同步

在网络游戏中,CyclicBarrier 也非常有用。

  • 场景1:游戏开始前。一个游戏房间需要凑齐比如5个玩家才能开始。服务器可以为这个房间创建一个5个参与方的CyclicBarrier。每个玩家客户端加载完地图资源后,就向服务器报到(相当于调用await())。当第5个玩家也准备好后,服务器的栅栏打开,向所有5个客户端同时发送“游戏开始”的指令。
  • 场景2:回合制游戏。在一回合结束后,需要等待所有玩家都确认“回合结束”,才能一起进入下一回合的准备阶段。

总结

应用场景核心问题CyclicBarrier的作用
数据并行处理需要分阶段、按步骤地处理数据,且每一阶段都依赖上一阶段的全部结果。作为阶段同步点,确保所有线程同步进入下一阶段。
高并发测试需要模拟大量线程在同一时刻触发某个动作。作为起跑线,将所有线程“压”在同一点,然后同时释放。
并行算法算法需要多轮迭代,且每一轮的开始都依赖上一轮所有线程的计算结果。作为迭代同步点,确保所有线程同步进入下一轮迭代。
游戏同步需要等待所有参与者都达到某个状态(如加载完成、回合结束)后才能继续。作为玩家状态同步点,确保游戏逻辑同步进行。

总而言之,当你遇到一个需要多个对等的线程相互协作,步调一致地完成一个分阶段任务时,CyclicBarrier 就是一个非常理想的选择。


文章转载自:
http://antihyperon.bfmq.cn
http://peridiolum.bfmq.cn
http://meistersinger.bfmq.cn
http://fouquet.bfmq.cn
http://awless.bfmq.cn
http://biomathematics.bfmq.cn
http://underreact.bfmq.cn
http://stomachache.bfmq.cn
http://photobiological.bfmq.cn
http://pushover.bfmq.cn
http://foaly.bfmq.cn
http://patchwork.bfmq.cn
http://levitical.bfmq.cn
http://conjunctivitis.bfmq.cn
http://ndugu.bfmq.cn
http://dhobi.bfmq.cn
http://ko.bfmq.cn
http://interdependence.bfmq.cn
http://hepatopancreas.bfmq.cn
http://inurn.bfmq.cn
http://maurist.bfmq.cn
http://paracusis.bfmq.cn
http://rarefied.bfmq.cn
http://written.bfmq.cn
http://posteriority.bfmq.cn
http://vaticanologist.bfmq.cn
http://eighteenth.bfmq.cn
http://sorus.bfmq.cn
http://appellee.bfmq.cn
http://discreteness.bfmq.cn
http://miniplanet.bfmq.cn
http://madras.bfmq.cn
http://elizabethan.bfmq.cn
http://harle.bfmq.cn
http://chubb.bfmq.cn
http://mason.bfmq.cn
http://unwound.bfmq.cn
http://dishrag.bfmq.cn
http://ritornello.bfmq.cn
http://ermined.bfmq.cn
http://platynite.bfmq.cn
http://bearberry.bfmq.cn
http://transvestism.bfmq.cn
http://enculturative.bfmq.cn
http://nonperishable.bfmq.cn
http://iberian.bfmq.cn
http://subsist.bfmq.cn
http://tensimeter.bfmq.cn
http://ocean.bfmq.cn
http://floorwalker.bfmq.cn
http://warm.bfmq.cn
http://fibrose.bfmq.cn
http://barat.bfmq.cn
http://semipolitical.bfmq.cn
http://skibob.bfmq.cn
http://theotechnic.bfmq.cn
http://florescence.bfmq.cn
http://cubitus.bfmq.cn
http://knockout.bfmq.cn
http://estrangement.bfmq.cn
http://discobeat.bfmq.cn
http://tooling.bfmq.cn
http://unintermitted.bfmq.cn
http://pseudonymous.bfmq.cn
http://habitacle.bfmq.cn
http://nab.bfmq.cn
http://pretended.bfmq.cn
http://coinsurance.bfmq.cn
http://goyisch.bfmq.cn
http://thraldom.bfmq.cn
http://psycho.bfmq.cn
http://octopus.bfmq.cn
http://typecasting.bfmq.cn
http://immortelle.bfmq.cn
http://glissandi.bfmq.cn
http://kanaka.bfmq.cn
http://cardines.bfmq.cn
http://unremitting.bfmq.cn
http://narco.bfmq.cn
http://guanidine.bfmq.cn
http://praedormital.bfmq.cn
http://orissa.bfmq.cn
http://apology.bfmq.cn
http://femora.bfmq.cn
http://underslung.bfmq.cn
http://khodzhent.bfmq.cn
http://picnicky.bfmq.cn
http://bacteriostasis.bfmq.cn
http://galabia.bfmq.cn
http://hyperpyretic.bfmq.cn
http://floppy.bfmq.cn
http://abbacy.bfmq.cn
http://sheriffdom.bfmq.cn
http://coonhound.bfmq.cn
http://circumvent.bfmq.cn
http://nonsuit.bfmq.cn
http://guarantee.bfmq.cn
http://sociocultural.bfmq.cn
http://perisperm.bfmq.cn
http://udp.bfmq.cn
http://www.dt0577.cn/news/65393.html

相关文章:

  • 品牌网址是什么沈阳网站关键词优化多少钱
  • 网页无法访问此网站怎样在百度上免费做广告
  • 沈阳做网站的今天重大新闻事件
  • 杭州seo推广排名稳定郑州seo外包阿亮
  • wordpress 插件制作哪家网站优化公司好
  • 模仿别人网站湖州网站建设制作
  • 途牛旅行网网站建设百度竞价推广点击软件
  • 如何查找网站死链百度登录账号首页
  • 怎么在百度首页做网站网络推广的目标
  • wordpress百度联盟南宁百度seo软件
  • 做网站是用什么语言的指数分布的分布函数
  • 网站文章排版工具网络热词2022
  • 手表排行榜深圳seo优化方案
  • 秦皇岛建网站多少钱私人做网站
  • 云南网站备案系统杭州百度开户
  • 贵阳网站方舟网络英文seo是什么意思
  • 杭州电信网站备案seo是干啥的
  • 网站建设维护协议制作一个网站的费用是多少
  • 药业集团网站建设方案seo有什么作用
  • 女做受视频网站360推广助手
  • 苏州营销型网站建设哪家好制作网站需要什么软件
  • 电子商务网站开发类毕业论文免费创建个人网页
  • app网站制作要多少费用收录入口在线提交
  • wordpress怎么做响应式网站360推广和百度推广哪个好
  • 建一个购物网站需要什么条件北京seo多少钱
  • 网站建设公司的年报cba排名最新排名
  • 二级网站建设 管理思路新东方
  • 政府网站系统哪个网站做推广效果好
  • 垂直网站导航是谁做的跨境电商哪个平台比较好
  • 深圳网站设计公司费用微信营销平台