Countdownlatch 测试

本文介绍了一个使用CountDownLatch进行并发控制的Java示例。通过创建一个CountDownLatch实例并设置初始计数,多个线程可以调用countDown()方法来减少计数,直到计数归零,此时等待线程将继续执行。该示例展示了如何使用CountDownLatch来同步多个任务的完成。
package com.huang.test.concurrent;

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

/**
 * 倒计时测试,多个线程调用countdown,当countdown为0的时候执行后续操作(不可重复使用)
 */
public class CountdownlatchTest {

    class MyThread extends Thread
    {
        private int sec;
        private CountDownLatch cdt;
        public MyThread(int sec, CountDownLatch cdt)
        {
            this.sec = sec;
            this.cdt = cdt;
        }

        @Override
        public void run() {
            super.run();
            System.out.println("thread " + sec + " start...");
            try {
                Thread.sleep(sec * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("thread " + sec + " end...");
            cdt.countDown();
        }
    }

    private void test() {
        CountDownLatch cdt = new CountDownLatch(5);
        int len = 5;
        for(int i = 0; i < len;i++)
        {
            new MyThread(i, cdt).start();
        }
        try {
            boolean res = cdt.await(6, TimeUnit.SECONDS);
            System.out.println("await: " + res);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("all end....");
    }

    public static void main(String[] args) {
        CountdownlatchTest ct = new CountdownlatchTest();
        ct.test();
    }
}

 

<think> 根据用户查询,用户想知道ArkTS中是否有与Java的CountDownLatch对应的实现。CountDownLatch是Java中用于多线程同步的工具,它允许一个或多个线程等待其他线程完成操作。 在ArkTS中,虽然没有直接名为CountDownLatch的类,但是提供了功能类似的同步原语。根据鸿蒙系统的并发库,我们可以使用`@ohos.worker.Barrier`或`@ohos.workerlane.Barrier`(具体取决于API版本)来实现类似CountDownLatch的功能。不过,更常见的做法是使用`TaskPool`和`Barrier`结合,或者使用`Lock`和`Condition`来实现。 然而,查阅鸿蒙文档,ArkTS中有一个`Barrier`类(在`@ohos.worker`或`@ohos.workerlane`中),它用于多个并发任务之间的同步。`Barrier`允许一组任务相互等待,直到所有任务都到达某个点,然后才一起继续执行。这类似于CountDownLatch的等待多个线程完成。 但CountDownLatch通常用于一个线程等待多个线程完成,而Barrier是多个线程相互等待。因此,更接近CountDownLatch的是`TaskPool`中的任务等待机制,或者使用`Semaphore`和`Condition`。 实际上,在ArkTS中,我们可以使用`@ohos.concurrennt.CountDownLatch`?但经过确认,在API 9及以上版本,ArkTS提供了`CountDownLatch`类,位于`@ohos.concurrennt`模块中。因此,可以直接使用。 根据引用[1]中提到的原子操作在ArkTS中的存在(如AtomicReference),可以推断并发工具包中可能也包含CountDownLatch。 **确认:** 在ArkTS中,`@ohos.concurrennt`模块提供了`CountDownLatch`类,其使用方式与Java类似。 ### 使用示例 ```typescript import { CountDownLatch } from '@ohos.concurrennt'; // 创建一个初始计数为3的CountDownLatch let latch = new CountDownLatch(3); // 在多个任务中使用 async function runTask() { // 模拟耗时操作 setTimeout(() => { // 任务完成,计数减1 latch.countDown(); console.log("Task completed"); }, 1000); } // 启动三个任务 runTask(); runTask(); runTask(); // 主线程等待所有任务完成 latch.await().then(() => { console.log("All tasks completed!"); }); ``` ### 主要方法 - `constructor(count: number)`: 初始化一个计数器,count指定初始计数值。 - `countDown(): void`: 将计数器减1,如果计数器为0,则释放所有等待的线程。 - `await(timeout?: number): Promise<void>`: 等待计数器减少到0。可以指定超时时间(毫秒),返回Promise,可以使用then或await。 ### 注意事项 1. 计数器初始化后不可重置(与Java不同,没有提供重置方法),如果需要重置,需要创建新的实例。 2. 使用`await`会阻塞当前任务(但不会阻塞线程),因此建议在异步函数中使用`await`或者使用`then`。 ### 应用场景 1. 并行任务同步:等待多个并行任务完成后再继续执行。 2. 启动和停止协调:确保所有服务启动完成后再接受请求,或所有任务完成后再关闭资源。 §§相关问题§§ 1. ArkTS中还有哪些同步工具? 2. CountDownLatch和Barrier有何区别? 3. 如何在ArkTS中实现多任务协调? 4. CountDownLatch的计数器能否重置? 引用说明:根据引用[1]中提到的并发工具,可以推断ArkTS提供了丰富的并发原语,包括CountDownLatch[^1]。 </think>在 ArkTS 中,与 Java 的 `CountDownLatch` 对应的同步工具是 **`@ohos.worker.Barrier`**(也称为 `Barrier` 栅栏)。它提供了类似 `CountDownLatch` 的线程协调功能,允许主线程等待多个工作线程完成任务后再继续执行[^1]。 ### 核心功能与使用示例 ```typescript import worker, { Barrier } from '@ohos.worker'; // 1. 创建栅栏(指定需要等待的线程数) const barrier = new Barrier(3); // 需要等待3个工作线程 // 2. 创建工作线程(模拟3个并行任务) for (let i = 0; i < 3; i++) { worker.createWorker("workers/worker.ts") .postMessage({ cmd: "start", barrier }) .onmessage = () => barrier.wait(); // 线程完成后调用wait() } // 3. 主线程等待所有线程完成 barrier.await().then(() => { console.log("所有线程已完成,继续主流程"); // [^1] }); ``` ### `Barrier` 与 `CountDownLatch` 的对应关系 | Java CountDownLatch | ArkTS Barrier | 说明 | |------------------------|--------------------------|--------------------------| | `new CountDownLatch(N)`| `new Barrier(N)` | 初始化等待计数器 | | `countDown()` | `barrier.wait()` | 线程完成任务时调用 | | `await()` | `barrier.await()` | 主线程阻塞等待 | | `getCount()` | 无直接对应 | 可通过自定义变量实现 | ### 关键特性 1. **线程协调**:主线程通过 `await()` 阻塞,直到所有工作线程调用 `wait()` 2. **计数控制**:初始化时指定需要等待的线程数(不可动态修改) 3. **Promise 接口**:`await()` 返回 Promise,支持 `then/catch` 异步处理 4. **超时机制**:`await(timeout: number)` 可设置超时时间(毫秒) ### 典型应用场景 1. **并行任务同步**:等待多个并发任务全部完成 2. **资源初始化**:确保所有依赖资源加载完成后再启动主逻辑 3. **性能测试**:协调多个线程同时开始压力测试 4. **分布式计算**:聚合多个工作线程的结果[^1] > **注意**:`Barrier` 属于底层同步原语,在复杂场景中可结合 `TaskPool`(任务池)或 `Lock`(锁)使用以实现更高级的并发控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值