首页 > 本系吾专栏 > countdownlatch(理解CountDownLatch)

countdownlatch(理解CountDownLatch)

理解CountDownLatch

CountDownLatch是什么:

CountDownLatch是Java.util.concurrent包中的一个同步工具类,用来协调多个线程之间的执行,使得某个线程在其他线程执行完毕后再执行。它的作用与join方法相似,但是它比join方法更灵活、更高效。

CountDownLatch的简单应用:

countdownlatch(理解CountDownLatch)

我们可以通过一个简单的例子来理解CountDownLatch的应用。假设我们现在准备去旅行,但是我们的行李里还需要放很多东西。现在有三个朋友要与我们一起旅行,他们分别打算带上自己的东西。我们需要等到三个朋友的东西全部准备好之后才能出发,否则我们就只能少带东西或者推迟出发时间了。于是我们就可以用CountDownLatch来协调所有人准备东西,CountDownLatch的计数器初始值为3,也就是需要等待三个线程准备好东西之后才能执行我们自己的任务:

```javapublic class TravelTogether { public static void main(String[] args) { int num = 3; CountDownLatch latch = new CountDownLatch(num); for (int i = 0; i < num; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + \"准备好了。\"); latch.countDown(); }).start(); } try { latch.await(); System.out.println(\"所有人都准备好了,出发!\"); } catch (InterruptedException e) { e.printStackTrace(); } }}```

运行结果是:

countdownlatch(理解CountDownLatch)

```Thread-0准备好了。Thread-2准备好了。Thread-1准备好了。所有人都准备好了,出发!```

CountDownLatch的深入应用:

countdownlatch(理解CountDownLatch)

除了像上面那样组织并行协作工作之外,CountDownLatch还可以用来解决更加复杂的场景。比如,我们想要在多个线程中进行某项任务,并且需要保证这些任务都完成后才能在主线程中进行后续操作。可以想象成这样一个场景:我们需要爬取多个网站的数据,并且这些网站的数据都需要一定的时间才能获取到。如果我们采用串行的方式来获取这些数据,那么效率很低;如果我们采用并行的方式获取并且不等待所有数据获取完毕就进行后续操作,那么可能会得到不完整的数据,影响后续的处理。所以我们需要等待所有网站的数据都获取到之后再进行后续的处理。

我们可以使用类似如下的代码来实现:

```javapublic class MultiWebPageDemo { private static final String[] WEBSITE_LIST = { \"http://www.baidu.com\", \"http://www.alibaba.com\", \"http://www.qq.com\", \"http://www.jd.com\", \"http://www.taobao.com\", \"http://www.sina.com\", \"http://www.weibo.com\", \"http://www.amazon.cn\", }; private static ExecutorService executorService = Executors.newFixedThreadPool(WEBSITE_LIST.length); private static CountDownLatch latch = new CountDownLatch(WEBSITE_LIST.length); public static void main(String[] args) throws InterruptedException { for (String url : WEBSITE_LIST) { executorService.submit(() -> { System.out.println(String.format(\"start handle %s\", url)); spider(url); latch.countDown(); }); } latch.await(); System.out.println(\"所有数据获取完毕,开始分析处理数据。\"); executorService.shutdownNow(); } private static void spider(String url) { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(String.format(\"handle %s\", url)); }}```

上述代码中使用了固定数量的线程池来爬取八个网站的数据,CountDownLatch的计数器初始为八。每当一个网站的数据获取完毕,CountDownLatch的计数器就会减少1,直到计数器变成0,就说明所有网站的数据都已经获取完毕了,此时可以进行一些后续的数据处理操作。

总结:

CountDownLatch是一个非常实用的同步工具类,可以有效地协调多个线程之间的执行,提高并行处理任务的效率。在实际应用中,我们可以根据具体的场景进行不同的使用。

版权声明:《countdownlatch(理解CountDownLatch)》文章主要来源于网络,不代表本网站立场,不承担相关法律责任,如涉及版权问题,请发送邮件至3237157959@qq.com举报,我们会在第一时间进行处理。本文文章链接:http://www.bxwic.com/bxwzl/32005.html

countdownlatch(理解CountDownLatch)的相关推荐