cyclicBarrier是有自动重置功能的,我们可以用这个功能来实现分阶段:
还是之前的需求:
开启3个线程,分别打印字母a,b,c各10次,然后进入下一阶段打印后面的字母d,e,f各10次,然后再进入下一阶段.......以此类推,直到整个字母表全部打印完毕。
下面是代码,可以看到是有点麻烦的
cyclicBarrier是没有明确的分段功能的,坑爹的是如果一个线程不await,其他线程是不能进入下个阶段的。然后你要自己比较精确的去什么await,什么时候退出。
原因是Phaser有个总的状态管理,但是cyclicBarrier没有,如果单纯用await来代替Phaser的arrive,那么会有部分线程一直阻塞。
package com.eyu.ahxy.module.thread;
import java.util.concurrent.CyclicBarrier;
public class MyTest2 {
public static void main(String[] args) throws Exception {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
char a = 'a';
for (int i = 0; i < 3; i++) { // 创建并启动3个线程
new MyThread2((char) (a + i), cyclicBarrier).start();
}
}
}
class MyThread2 extends Thread {
private char c;
private CyclicBarrier cyclicBarrier;
public MyThread2(char c, CyclicBarrier cyclicBarrier) {
this.c = c;
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
while (true) {
if (c <= 'z') {
String string = "";
for (int i = 0; i < 10; i++) {
string += c;
}
string += "\n";
System.out.print(string);
}
// y是最后一轮的第一个打印, 结束退出
if (c >= 'y') {
return;
}
c = (char) (c + 3);
try {
// 等待下一轮
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier的字面意思是可循环(Cyclic)使用的...
Java中的`CyclicBarrier`是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点。这个屏障点就像一个交通信号灯,只有当所有的车辆(线程)都到达了交叉口,信号灯才会变为绿灯,允许它们...
为此,Java提供了多种机制来帮助实现线程间的协作与同步,其中包括了`CyclicBarrier`类。 ### 1.2 CyclicBarrier概述 `CyclicBarrier`是Java并发工具包(`java.util.concurrent`)中的一个强大工具。它的主要作用...
《JAVA CyclicBarrier类详解》 CyclicBarrier是Java并发包(java.util.concurrent)中一个重要的同步辅助类,它的主要作用在于协调多个线程之间的协作,使得这些线程能够一起到达一个公共的“集结点”(称为屏障点...
总结来说,CountDownLatch和CyclicBarrier虽然都是同步工具,但在实现和使用上有所不同。CountDownLatch关注的是一个单一的计数,当计数归零时,所有等待的线程都被释放,常用于一次性同步事件。而CyclicBarrier关注...
总结来说,`CyclicBarrier`是Java并发库中一种强大的工具,它可以帮助开发者实现复杂线程间的协调和同步,确保多个线程按照预期顺序执行。理解和熟练使用`CyclicBarrier`对于优化多线程应用程序的性能和逻辑是非常...
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
CyclicBarrier 的使用场景有很多,例如,在一个游戏中,所有玩家都需要等待其他玩家到达某个点时,可以使用 CyclicBarrier 来实现。又例如,在一个科学计算中,多个线程需要等待其他线程完成计算时,也可以使用 ...
Java多线程之CyclicBarrier的使用方法是Java多线程编程中的一种同步机制,用于实现多个线程之间的同步协作。CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待到达一个共同的屏障点,直到所有线程都...
本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。 CountDownLatch和CyclicBarrier是Java并发编程中两个非常有用的同步工具,它们在不同的场景下有着各自的优势。...
CyclicBarrier的实现原理是通过条件队列`trip`来对线程进行阻塞的。每个线程在到达屏障点的时候都会调用`await`方法,将自己阻塞,此时计数器`count`会减1,当`count`减为0的时候所有因调用`await`方法而被阻塞的...
代码示例中,我们创建了一个Player类,实现了Runnable接口,在run方法中,我们使用CyclicBarrier的await方法来等待其他玩家到达当前关卡,当所有玩家到达当前关卡时,所有玩家才能继续下一步的游戏。 CyclicBarrier...
- 使用CyclicBarrier实现多线程分治策略,每个子任务完成后来一次全局计算的例子。 - 线程间的异常处理,包括中断和超时的处理。 - 结合Future和ExecutorService,进一步提高并发性能和灵活性。 - 在大型项目中的...
本篇文章将深入探讨如何使用Java实现多线程文件传输,并涵盖以下几个关键知识点: 1. **线程基础**:在Java中,线程是程序执行的基本单元,可以通过实现`Runnable`接口或继承`Thread`类来创建。`Runnable`接口更...
本实例将探讨如何利用Java实现一个具有进度条显示功能的多线程应用。进度条通常用于可视化地表示某个任务的完成程度,这对于长时间运行的操作如文件下载、上传或大型计算来说非常有用。 首先,我们要理解Java中的...
本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...
CyclicBarrier实现多个线程相互等待的案例(实现累加操作)
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...