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

郓城住房和城乡建设局网站电商怎么做如何从零开始视频

郓城住房和城乡建设局网站,电商怎么做如何从零开始视频,永康建设局网站,做第三方的qq互联接口时_回调到自己的网站时要延时很久是什么原因基本概念 CountDownLatch 基于一个计数器实现,在创建 CountDownLatch 对象时需要指定一个初始计数,这个计数代表需要等待完成的操作数量。线程可以调用 CountDownLatch 的 countDown() 方法将计数器减 1,而其他线程可以调用 await() 方法进入…

基本概念

CountDownLatch 基于一个计数器实现,在创建 CountDownLatch 对象时需要指定一个初始计数,这个计数代表需要等待完成的操作数量。线程可以调用 CountDownLatchcountDown() 方法将计数器减 1,而其他线程可以调用 await() 方法进入等待状态,直到计数器的值变为 0 才会继续执行。

使用场景

  • 并行任务同步:当有多个并行任务需要完成,并且主线程需要等待所有并行任务都完成后才能继续执行后续操作时,可以使用 CountDownLatch。例如,在多线程下载文件的场景中,主线程需要等待所有子线程都下载完成后再进行文件的合并操作。
  • 资源初始化:在某些情况下,需要确保所有必要的资源都初始化完成后,主线程才能继续执行后续业务逻辑。可以使用 CountDownLatch 来协调资源初始化线程和主线程的执行顺序。

工作原理

  • 初始化:创建 CountDownLatch 对象时,需要传入一个整数作为计数器的初始值。
  • 计数递减:每个需要完成的任务线程在完成任务后调用 countDown() 方法,将计数器的值减 1。
  • 等待操作:调用 await() 方法的线程会被阻塞,直到计数器的值变为 0。计数器变为 0 后,所有等待的线程会被释放,继续执行后续代码。

代码示例

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {// 创建一个 CountDownLatch 对象,初始计数为 3CountDownLatch latch = new CountDownLatch(3);// 创建并启动 3 个工作线程for (int i = 0; i < 3; i++) {final int taskId = i;Thread worker = new Thread(() -> {try {System.out.println("线程 " + taskId + " 开始执行任务");// 模拟任务执行Thread.sleep((long) (Math.random() * 1000));System.out.println("线程 " + taskId + " 完成任务");} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 任务完成,计数器减 1latch.countDown();}});worker.start();}// 主线程等待所有工作线程完成任务System.out.println("主线程等待所有任务完成...");latch.await();System.out.println("所有任务已完成,主线程继续执行");}
}

代码解释

  1. 创建 CountDownLatch 对象CountDownLatch latch = new CountDownLatch(3); 表示需要等待 3 个任务完成。
  2. 启动工作线程:通过 for 循环创建并启动 3 个工作线程,每个线程模拟执行一个任务,任务完成后调用 latch.countDown() 方法将计数器减 1。
  3. 主线程等待:主线程调用 latch.await() 方法进入等待状态,直到计数器的值变为 0。
  4. 继续执行:当计数器的值变为 0 时,主线程被唤醒,继续执行后续代码。

注意事项

  • CountDownLatch 的计数器一旦初始化为某个值,就不能再重置。如果需要重置计数器,可以考虑使用 CyclicBarrier
  • await() 方法有两种形式:无参的 await() 会一直等待,直到计数器变为 0;带参数的 await(long timeout, TimeUnit unit) 会在指定的时间内等待,如果超过指定时间计数器仍未变为 0,线程会继续执行。

这种表述大体上抓住了 CountDownLatch 的核心功能,但存在一些细节需要更精准地说明,下面详细解释。

准确理解关键方法的作用

await() 方法

await() 方法会让调用它的线程(不一定是主线程,任何线程都可以调用)进入等待状态。当线程调用 await() 时,它会检查 CountDownLatch 内部计数器的值。如果计数器不为 0,线程就会被阻塞,进入等待状态;只有当计数器的值变为 0 时,线程才会从 await() 方法返回,继续执行后续代码。

countDown() 方法

每调用一次 countDown() 方法,CountDownLatch 的计数器就会减 1。不过,并不是每次调用 countDown() 都会唤醒其他线程。只有当计数器的值从大于 0 减为 0 时,才会唤醒所有在 await() 方法中等待的线程。

结合示例代码说明

import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {// 创建一个 CountDownLatch 实例,初始计数器值为 3CountDownLatch latch = new CountDownLatch(3);// 启动 3 个工作线程for (int i = 0; i < 3; i++) {final int workerId = i;new Thread(() -> {try {System.out.println("工作线程 " + workerId + " 开始工作");// 模拟工作耗时Thread.sleep(1000); System.out.println("工作线程 " + workerId + " 完成工作");} catch (InterruptedException e) {e.printStackTrace();} finally {// 工作完成,计数器减 1latch.countDown(); }}).start();}System.out.println("主线程等待所有工作线程完成工作...");// 主线程调用 await() 进入等待状态latch.await(); System.out.println("所有工作线程已完成工作,主线程继续执行");}
}

代码执行流程分析

  1. 初始化:创建 CountDownLatch 对象,将计数器初始值设为 3。
  2. 启动工作线程:启动 3 个工作线程,每个线程模拟执行一些工作,完成后调用 countDown() 方法。
  3. 主线程等待:主线程调用 await() 方法,此时计数器值为 3,主线程进入等待状态。
  4. 工作线程完成任务:每个工作线程完成任务后调用 countDown(),计数器依次减 1。前两次调用 countDown() 时,计数器不为 0,不会唤醒等待线程;当第三次调用 countDown() 使计数器变为 0 时,会唤醒在 await() 方法中等待的主线程。
  5. 主线程继续执行:主线程从 await() 方法返回,继续执行后续代码。

综上所述,await() 方法让调用线程等待计数器变为 0,countDown() 方法用于减少计数器的值,仅当计数器变为 0 时才会唤醒等待线程。

简易版实现
public class MyCountDownLatch {private Integer count;public MyCountDownLatch(int count){this.count = count;}public synchronized void countDown(){count--;if (count == 0){notify();//唤醒等待队列中的一个线程//notifyAll();//唤醒等待队列中的所有线程}}public synchronized void await() throws InterruptedException{System.out.println(count);if (count != 0){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}
http://www.dtcms.com/wzjs/544475.html

相关文章:

  • 网站特效代码html网站建站描述撰写
  • 如何仿网站模板企业qq多少钱一年
  • 东莞网站建设案例怎么开网店挣钱
  • 网站制作 火星科技安徽亳州建设厅网站
  • tuzicms做企业手机网站如何wordpress验证码插件
  • 小说网站怎么做原创wordpress如何设置中英文切换
  • php网站建设制作服务图片动画制作
  • 自己建一个网站能过期吗国内知名室内设计公司
  • 怎么给网站制作二维码深圳seo优化信
  • 网站优化技术%2enet网站开发
  • 网站群 建设 方案怎么在百度做广告
  • 建立网站的公司杭州商贸有限公司网站建设
  • 兰州人工优化网站seo规划
  • 做网站时的注册权起到什么作用小广告怎么能弄干净
  • 手机网站建设公司wordpress 抱歉您不能访问此页面
  • 马鞍山建设机械网站网站建设 全包 模板
  • 网站seo优化管理系统腾讯云 个人网站
  • 百度网盟推广怎么选择投放网站外贸网站搭建
  • 搜索引擎营销的基本流程做神马网站优化排
  • 上海网站建设设计公司排名成都h5模板建站
  • 有哪些做ppt网站沈阳 网站建设
  • 专业信息门户网站定制水立方建设集团有限公司网站
  • 个人网站如何做淘客网站宁乡网站开发
  • 开发网站开发建设通类型网站叫啥
  • 个人网站做贷款广告邢台百姓网官网
  • 学校网站结构图更新标签wordpress
  • 珠海网站建设怎样时事新闻热点事件
  • 哪个网站衬衣做的好做设计必知网站
  • 网站和网页的概念网站分析欣赏
  • windows10php网站建设百度推广就是做网站吧