`

请您先登录,才能继续操作

java用cyclicBarrier来实现Phaser的分段功能

 
阅读更多
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();
			}
		}
	}
}
0
1
分享到:
评论

相关推荐

    java.CyclicBarrier(处理方案示例).md

    java.CyclicBarrier(处理方案示例).md

    Java并发实例之CyclicBarrier的使用

    CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier的字面意思是可循环(Cyclic)使用的...

    Java中CyclicBarrier的用法分析

    Java中的`CyclicBarrier`是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点。这个屏障点就像一个交通信号灯,只有当所有的车辆(线程)都到达了交叉口,信号灯才会变为绿灯,允许它们...

    Java中的CyclicBarrier类最全讲义

    为此,Java提供了多种机制来帮助实现线程间的协作与同步,其中包括了`CyclicBarrier`类。 ### 1.2 CyclicBarrier概述 `CyclicBarrier`是Java并发工具包(`java.util.concurrent`)中的一个强大工具。它的主要作用...

    JAVA CyclicBarrier类详解.docx

    《JAVA CyclicBarrier类详解》 CyclicBarrier是Java并发包(java.util.concurrent)中一个重要的同步辅助类,它的主要作用在于协调多个线程之间的协作,使得这些线程能够一起到达一个公共的“集结点”(称为屏障点...

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    总结来说,CountDownLatch和CyclicBarrier虽然都是同步工具,但在实现和使用上有所不同。CountDownLatch关注的是一个单一的计数,当计数归零时,所有等待的线程都被释放,常用于一次性同步事件。而CyclicBarrier关注...

    CyclicBarrier的用法

    总结来说,`CyclicBarrier`是Java并发库中一种强大的工具,它可以帮助开发者实现复杂线程间的协调和同步,确保多个线程按照预期顺序执行。理解和熟练使用`CyclicBarrier`对于优化多线程应用程序的性能和逻辑是非常...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...

    java并发编程专题(九)----(JUC)浅析CyclicBarrier

    CyclicBarrier 的使用场景有很多,例如,在一个游戏中,所有玩家都需要等待其他玩家到达某个点时,可以使用 CyclicBarrier 来实现。又例如,在一个科学计算中,多个线程需要等待其他线程完成计算时,也可以使用 ...

    java多线程之CyclicBarrier的使用方法

    Java多线程之CyclicBarrier的使用方法是Java多线程编程中的一种同步机制,用于实现多个线程之间的同步协作。CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待到达一个共同的屏障点,直到所有线程都...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。 CountDownLatch和CyclicBarrier是Java并发编程中两个非常有用的同步工具,它们在不同的场景下有着各自的优势。...

    Java并发系列之CyclicBarrier源码分析

    CyclicBarrier的实现原理是通过条件队列`trip`来对线程进行阻塞的。每个线程在到达屏障点的时候都会调用`await`方法,将自己阻塞,此时计数器`count`会减1,当`count`减为0的时候所有因调用`await`方法而被阻塞的...

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

    代码示例中,我们创建了一个Player类,实现了Runnable接口,在run方法中,我们使用CyclicBarrier的await方法来等待其他玩家到达当前关卡,当所有玩家到达当前关卡时,所有玩家才能继续下一步的游戏。 CyclicBarrier...

    CountDownLatch和CyclicBarrier用法实例大全

    - 使用CyclicBarrier实现多线程分治策略,每个子任务完成后来一次全局计算的例子。 - 线程间的异常处理,包括中断和超时的处理。 - 结合Future和ExecutorService,进一步提高并发性能和灵活性。 - 在大型项目中的...

    java实现多线程文件传输

    本篇文章将深入探讨如何使用Java实现多线程文件传输,并涵盖以下几个关键知识点: 1. **线程基础**:在Java中,线程是程序执行的基本单元,可以通过实现`Runnable`接口或继承`Thread`类来创建。`Runnable`接口更...

    java多线程进度条实例

    本实例将探讨如何利用Java实现一个具有进度条显示功能的多线程应用。进度条通常用于可视化地表示某个任务的完成程度,这对于长时间运行的操作如文件下载、上传或大型计算来说非常有用。 首先,我们要理解Java中的...

    Java并发工具类示例

    本文将详细解析Java并发工具类,并通过示例代码介绍`CountDownLatch`、`CyclicBarrier`、`Phaser`、`Semaphore`和`ThreadLocal`的用法。 1. **CountDownLatch** `CountDownLatch`是一个计数器,通常用于等待多个...

    CyclicBarrier实现多个线程相互等待的案例(实现累加操作)

    CyclicBarrier实现多个线程相互等待的案例(实现累加操作)

Global site tag (gtag.js) - Google Analytics