,,Java并发编程(CyclicBarrier)实例详解

,,Java并发编程(CyclicBarrier)实例详解

本文主要介绍有关JAVA并发编程(CyclicBarrier)实例的详细讲解的相关资料。Java在编写并发程序的时候,需要仔细思考并发进程的控制,如何让各个线程协同完成某项工作。

Java并发编程(CyclicBarrier)实例详解

前言:

在使用JAVA编写并发程序时,我们需要仔细思考并发进程的控制,以及如何让各个线程协同完成某项工作。有时候,我们启动N个线程做一件事,只有这N个线程都达到某个临界点,才能继续后面的工作。也就是说,如果这N个线程中有一个线程先到达一个预定义的临界点,那么它必须等待其他N-1个线程到达这个临界点,下一个工作才能继续。只要这N个线程中有一个没有达到所谓的临界点,其他线程就只能等待,哪怕是先达到临界点。

一、场景描述

有四个游戏玩家在玩游戏,游戏有三个级别。所有玩家到达后,必须允许每个关卡通过。事实上,如果玩家A在这个场景中首先到达1级,他必须等到其他所有玩家都到达1级后才能通过,这意味着线程之间需要相互等待。这和CountDownLatch的应用场景不同。CountDownLatch中的线程在达到运行目标后继续做其他事情,而这里的线程需要等待其他线程才能继续完成后面的工作。

二、CyclicBarrier介绍

CyclicBarrier字面意思是可以回收的屏障。它需要做的是让一组线程在到达一个障碍(也可以称为同步点)时被阻塞。直到最后一个线程到达屏障,屏障才会打开,所有被屏障拦截的线程都会继续工作。CyclicBarrier的默认构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数。每个线程调用await方法告诉CyclicBarrier我已经到达了关卡,然后当前线程被阻塞。

CyclicBarrier类有两种常见的构造方法:

1. CyclicBarrier(int parties)

这里的聚会也是一个柜台。例如,在初始化时,parties中的计数是3,因此当parties的计数是3时,拥有这个CyclicBarrier对象的线程将被唤醒。注意:当在运行时调用CyclicBarrier:await()时,参与方的计数将增加1,直到达到初始值。

2. CyclicBarrier(int parties, Runnable barrierAction)

此处当事人的解释与前面的施工方法相同。这里需要说明的是第二个参数(Runnable barrierAction)。这个参数是一个实现Runnable接口的类的对象,也就是说,当parties添加到初始值时,barrierAction的内容就开始了。

代码示例

包com.itmyhome

import Java . util . concurrent . brokenbarrierexception;

导入Java . util . concurrent . cyclic barrier;

/**

*玩家等级

* @作者itmyhome

*

*/

类播放器实现Runnable {

私人循环障碍循环障碍;

private int id

公共玩家(int id,CyclicBarrier cyclicBarrier) {

this . cyclic barrier=cyclic barrier;

this.id=id

}

@覆盖

公共无效运行(){

尝试{

System.out.println('玩家' id '正在玩第一关.');

cyclic barrier . await();

System.out.println('玩家' id '进入第二关.');

} catch (InterruptedException e) {

e . printstacktrace();

} catch(BrokenBarrierException e){

e . printstacktrace();

}

}

}

公共类CyclicBarrierTest {

公共静态void main(String[] args) {

//cyclic barrier cyclic barrier=new cyclic barrier(4);

cyclic barrier cyclic barrier=new cyclic barrier(4,

新的Runnable() {

@覆盖

公共无效运行(){

System.out.println('所有玩家进入第二关!');

}

});

for(int I=0;I 4;i ) {

新线程(新玩家(我,cyclicBarrier))。start();

}

}

}

输出结果:

0玩家正在玩第一关。

玩家在玩第一关。

玩家在玩第一关。

一号玩家在玩第一关。

所有玩家进入第二关!

3名玩家进入第二关。

1名玩家进入第二关。

玩家进入第二关。

0玩家进入第二关。

CyclicBarrier和CountDownLatch的区别

CountDownLatch:一个线程(或多个线程)只能在另外N个线程完成某件事之后才能执行。

CyclicBarrier: N个线程正在相互等待,并且所有线程必须在任何线程完成之前等待。

CountDownLatch的计数器只能使用一次。并且可以使用reset()方法重置CyclicBarrier的计数器。因此,CyclicBarrier可以处理更复杂的业务场景,例如,如果计算出错,可以重置计数器并要求线程再次执行。

CountDownLatch:递减计数模式,CyclicBarrier:递增计数模式

感谢您的阅读,希望能帮到您,也感谢您对本站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: