Java实现限定时间CountDownLatch并行场景

让我们详细讲解“Java实现限定时间CountDownLatch并行场景”的完整攻略。

CountDownLatch概述

CountDownLatch是Java中一个非常实用的工具,它可以用于协调多个线程之间的同步操作。它可以让等待某个特定条件发生的线程一直等待下去,直到该条件被满足后,所有等待的线程才会同时被唤醒并继续执行。

CountDownLatch的核心思想就是一个计数器,该计数器被初始化为一个正整数,并且在某些操作发生之后被递减。一组等待中的线程可以被阻塞,直到计数器为零。如果你只是需要一个简单的同步工具,并不像Semaphore这样复杂和强大,那么CountDownLatch是个不错的选择。

CountDownLatch的使用

CountDownLatch的使用比较简单,主要包括以下步骤:

  1. 创建一个CountDownLatch对象,并指定计数器的初始值(即需要等待的操作数)。
  2. 在工作线程中执行需要等待的操作。
  3. 在等待线程中使用await()方法等待操作完成。
  4. 在工作线程中完成每个操作时,使用countDown()方法递减计数器的值。

Java实现限定时间CountDownLatch并行场景攻略及示例代码

Java实现限定时间CountDownLatch并行场景攻略的步骤如下:

  1. 创建一个 CountDownLatch 对象,计数器的初始值设为要等待的操作数 N,即需要等待 N 个线程的操作完成。
  2. 在每个工作线程中执行相应的任务,然后使用 countDown() 方法递减计数器的值。如果递减后的值为0,则所有操作已完成。
  3. 在等待线程中,调用 await(long timeout, TimeUnit unit) 方法等待操作完成或超时。超时时间可以由参数指定。

下面是示例代码,其中有两个工作线程并行执行,主线程等待它们完成或超时:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class CountDownLatchDemo {
    private static final int WORKER_NUM = 2;
    private static final int WAIT_TIME = 5000;

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(WORKER_NUM);

        // 创建两个工作线程
        new Thread(new Worker(latch, "Worker1")).start();
        new Thread(new Worker(latch, "Worker2")).start();

        // 在主线程中等待操作完成或超时
        if (latch.await(WAIT_TIME, TimeUnit.MILLISECONDS)) {
            System.out.println("All workers finished the job!");
        } else {
            System.out.println("Timeout! Some workers are not finished yet.");
        }
    }

    // 工作线程
    static class Worker implements Runnable {
        private final CountDownLatch latch;
        private final String name;

        public Worker(CountDownLatch latch, String name) {
            this.latch = latch;
            this.name = name;
        }

        @Override
        public void run() {
            try {
                // 执行任务
                System.out.println(name + " is starting to work...");
                TimeUnit.SECONDS.sleep(3);
                System.out.println(name + " finished the job!");

                // 递减计数器
                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在上述示例代码中,创建了一个 CountDownLatch 对象 latch,并指定初始值为 2(即需要等待两个工作线程完成操作)。然后创建两个工作线程 Worker1 和 Worker2,在每个工作线程中执行相应任务,最终使用 countDown() 方法递减计数器的值。在主线程中使用 await(long timeout, TimeUnit unit) 方法等待两个工作线程完成操作或超时。如果所有工作线程在指定的时间内完成操作,主线程输出 "All workers finished the job!"。如果有任何一个工作线程还没有完成操作,则主线程输出 "Timeout! Some workers are not finished yet."。

另外,这里再给一个更实际的例子,假如我们需要在10秒内获取多个网站的内容,而每个网站的内容获取可能会需要不同时间,此时我们可以使用CountDownLatch来实现并行获取,然后将结果进行合并。具体操作流程如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class CountDownLatchDemo {
    private static final int NUM_SITES = 5;
    private static final int WAIT_TIME = 10;
    private static final Random random = new Random();

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(NUM_SITES);
        List<String> contents = new ArrayList<>();

        // 并行获取各个网站的内容
        for (int i = 0; i < NUM_SITES; i++) {
            new Thread(new SiteContentFetcher(latch, contents)).start();
        }

        // 等待所有网站的内容获取完成或超时
        if (latch.await(WAIT_TIME, TimeUnit.SECONDS)) {
            System.out.println("All site contents fetched: " + contents);
        } else {
            System.out.println("Timeout!");
        }
    }

    // 获取单个网站的内容
    static class SiteContentFetcher implements Runnable {
        private final CountDownLatch latch;
        private final List<String> contents;

        public SiteContentFetcher(CountDownLatch latch, List<String> contents) {
            this.latch = latch;
            this.contents = contents;
        }

        @Override
        public void run() {
            try {
                // 模拟获取网站内容的时间
                long time = random.nextInt(10);
                System.out.println(Thread.currentThread().getName() + " fetching site content, time: " + time);
                TimeUnit.SECONDS.sleep(time);

                // 保存网站内容
                contents.add(Thread.currentThread().getName() + ": content");
                System.out.println(Thread.currentThread().getName() + " finished fetching site content");

                // 递减计数器
                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在上述示例代码中,创建了一个 CountDownLatch 对象 latch,并指定初始值为 NUM_SITES(即需要等待 NUM_SITES 个网站的内容获取完成)。然后创建 NUM_SITES 个获取网站内容的工作线程,在每个工作线程中模拟获取网站内容的时间,实际获取网站内容并将其保存到列表中,最后使用 countDown() 方法递减计数器的值。在主线程中使用 await(long timeout, TimeUnit unit) 方法等待所有工作线程完成操作或超时。如果所有工作线程在指定的时间内完成操作,主线程输出获取到的所有网站内容。如果某个工作线程还没有完成操作,则主线程输出 "Timeout!"。

以上就是关于Java实现限定时间 CountDownLatch 并行场景的完整攻略和两个示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现限定时间CountDownLatch并行场景 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringBoot项目中的多数据源支持的方法

    为在Spring Boot项目中实现多数据源支持,有几种方法可供选择。以下是几种最常用的方法。 方法一:使用Spring Boot提供的自动配置 Spring Boot自动配置对于多个数据源配置非常方便。可以使用@ConfigurationProperties注释来定义不同的数据源。以下是实现多个数据源的示例: # application.yml sprin…

    Java 2023年5月20日
    00
  • SpringBoot浅析安全管理之Spring Security配置

    让我来详细讲解一下“SpringBoot浅析安全管理之Spring Security配置”的完整攻略。 概述 Spring Security是一个功能强大且灵活的框架,它为我们提供了许多功能,包括身份验证,授权,安全性配置等。本篇文章将介绍如何在Spring Boot项目中配置Spring Security。 依赖项 首先,请确保您已经添加了Spring S…

    Java 2023年5月20日
    00
  • SpringMVC实现文件上传下载的全过程

    OK,SpringMVC实现文件上传下载的全过程可以包含以下几个步骤: 添加MultipartResolver配置 在SpringMVC配置文件中,添加MultipartResolver配置,用于处理文件上传的请求。示例代码如下: <bean id="multipartResolver" class="org.spring…

    Java 2023年6月15日
    00
  • 基于Java文件输入输出流实现文件上传下载功能

    要实现文件上传下载的功能,我们可以基于Java的文件输入输出流来进行操作。以下为详细攻略: 文件上传功能实现 编写一个Java Servlet,用于接收上传的文件数据,并将其保存到服务器的指定目录下。示例代码如下所示: protected void doPost(HttpServletRequest request, HttpServletResponse …

    Java 2023年5月20日
    00
  • Java实现Dijkstra算法的示例代码

    让我来为你详细讲解“Java实现Dijkstra算法的示例代码”的完整攻略。 什么是Dijkstra算法? Dijkstra算法是一种用于在加权图中查找最短路径的算法。其基本思路是从起点开始,依次考虑所有可能的路径,并选择当前距离最近的节点作为下一个起点。通过不断更新节点的最短距离,最终找到起点到终点的最短路径。 实现步骤 实现Dijkstra算法的步骤如下…

    Java 2023年5月19日
    00
  • 自定义spring mvc的json视图实现思路解析

    我来详细讲解一下“自定义spring mvc的json视图实现思路解析”的完整攻略,包括以下内容: 一、实现思路概述 在使用Spring MVC进行web开发时,返回json视图是非常常见的操作。默认的情况下,Spring MVC使用Jackson库将对象转换为json格式的数据,并返回给前端。但是,在一些特殊的应用场景中,我们需要使用自定义的json视图。…

    Java 2023年5月26日
    00
  • Vue集成Iframe页面的方法示例

    关于Vue集成Iframe页面的方法示例,以下是我整理的详细攻略: 步骤一:在Vue项目中安装Vue-iframe插件 在Vue项目中集成Iframe页面首先需要安装Vue-iframe插件。Vue-iframe插件是专门用于在Vue项目中嵌入Iframe页面的插件,可以快速简单地实现Iframe页面的嵌入。在终端中执行以下命令即可完成Vue-iframe插…

    Java 2023年6月15日
    00
  • 深入浅析drools中Fact的equality modes

    深入浅析drools中Fact的equality modes 在drools中,我们经常会使用Fact来表示我们的规则中所需要的对象或者数据。在使用Fact的时候,我们需要考虑到Fact的Equality Modes(等值模式)问题。Equality Modes决定了如何比较两个Fact是否相等,进而对整个规则的执行结果产生影响。下面我们详细介绍一下droo…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部