Hazelcast - ICountDownLatch

java.util.concurrent.CountDownLatch 提供了一种方法让线程等待,而其他线程则在 JVM 的多线程环境中完成一组操作。

同样,ICountDownLatch 提供了 Java CountDownLatch 的分布式版本。 它提供了类似的函数:setCount、countDown、await 等。

ICountDownLatch 和 Java CountDownLatch 之间的主要区别在于,Java CountDownLatch 提供对单个 JVM 中线程的关键部分的保护,而 ICountDownLatch 为单个 JVM 以及多个 JVM 中的线程提供同步。

ICountDownLatch 有一个同步备份,这意味着如果我们的设置中有 5 个 JVM 正在运行,则只有两个 JVM 会保存此锁存器。

设置锁存器和等待锁存器

让我们在两个 JVM 上执行以下代码。 一个是主代码,另一个是工作代码。 该代码应该让工作线程等待,直到主线程完成。

示例

第一部分是主代码,它创建一个锁存器并对其进行倒计数。

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast=Hazelcast.newHazelcastInstance();
   // create a lock
   ICountDownLatch countDownLatch=hazelcast.getCountDownLatch("count_down_1");
   System.out.println("Setting counter");
   countDownLatch.trySetCount(2);
   Thread.sleep(2000);
   System.out.println("Counting down");
   countDownLatch.countDown();
   Thread.sleep(2000);
   System.out.println("Counting down");
   countDownLatch.countDown();
   System.exit(0);
}

第二段是工作代码,它创建一个锁存器并对其进行倒计数。

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
   // create a lock
   ICountDownLatch countDownLatch=hazelcast.getCountDownLatch("count_down_1");
   countDownLatch.await(5000, TimeUnit.MILLISECONDS);
   System.out.println("Worker successful");
   System.exit(0);
}

输出

代码的输出显示工作人员仅在倒计时完成到 0 后才进行打印。

Setting counter
Counting down
Counting down
Worker successful

有用的方法

Sr.No 函数名称 & 描述
1

await()

等待锁存器的计数达到零后再继续

2

countDown()

递减倒计时锁存器

3

trySetCount(int count)

设置锁存器的计数

4

getCount()

获取锁存器的当前计数

hazelcast_data_structures.html