`
qq466862016
  • 浏览: 128400 次
  • 来自: 杭州
社区版块
存档分类
最新评论

5、Java5多线程---同步辅助工具类CyclicBarrier

阅读更多

Java5多线程---同步辅助工具类CyclicBarrier

一、概述

CyclicBarrier是一个同步的辅助类,它允许一组线程互相等待,直到到达某个公告屏障点。在设计一组固定大小的线程的程序中,这些线程必须不时的相互等待,此时它很有用,因为该屏障在释放等待线程后可以重用,所以称它为循环的屏障下面看看对应的方法。

1、public CyclicBarrier(int parties, Runnable barrierAction)

创建一个新的CycleBarrier,它将在给定数量的参与者(线程)处于等待状态时候启动,并在启动barrier时执行给定的屏障操作,该操作由最后一个今日的屏障的线程执行。参数barrierAction是在启动屏障的时候执行命令,如果不执行任何操作则该参数是null

2、public int await()

        在所有参与者都已经在此barrier上调用 await方法之前,将一直等待。如果当前线程部署将要到达的最后一个线程将禁用它。

3、isBroken

          查询此屏障是否处于损坏状态

4、reset

            将屏障重置为其初始化状态,如果所有参与者目前都在屏障处等待,则它们将返回,而且会抛出一个异常

5、getNumberWaiting

        返回当前在屏障处等待的参与者数目。

 

二、应用案例

 每年都有新兵蛋子入伍,那么每天的集合报到操练是必不可少的。那么我们来利用CyclicBarrier来模拟新兵蛋子 集合-报到-报数-报数完毕-各自入队 这个流程。具体代码如下:

package java5;

import java.util.concurrent.CyclicBarrier;

/***
 * CyclicBarrier 同步辅助类的使用
 * 20个新兵蛋子 集合-报到-报数-各自归队
 * @author dongtian
 * @date   2015年6月16日 下午3:20:38
 */
public class MyArmy {

	private static  CyclicBarrier cyclicBarrier = new CyclicBarrier(20);
	
	
	
	/***
	 * 集合任务
	 * @author dongtian
	 * @date   2015年6月16日 下午2:50:55
	 */
	private static class  SetTask extends Thread {
		
		@Override
		public void run() {
			
			try {
				//开始报到
				System.err.println( Thread.currentThread().getName() + "  报到");
				Thread.currentThread().sleep(1000);
				cyclicBarrier.await();
				//开始报数
				System.err.println(Thread.currentThread().getName() +"  开始报数...");
				cyclicBarrier.await();
				System.err.println(Thread.currentThread().getName() +"  报数完毕!");
				//等到都报完各自归队
				cyclicBarrier.await();
				System.err.println(Thread.currentThread().getName() +"  归队");
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
	}
	public static void main(String[] args) {
		
		for (int i = 0; i < 20; i++) {
			SetTask setTask = new SetTask();
			setTask.start();
		}
		
	}
}

 

 运行结果如下:

Thread-0  报到
Thread-2  报到
Thread-1  报到
Thread-10  报到
Thread-8  报到
Thread-6  报到
Thread-4  报到
Thread-3  报到
Thread-5  报到
Thread-7  报到
Thread-14  报到
Thread-11  报到
Thread-9  报到
Thread-16  报到
Thread-13  报到
Thread-15  报到
Thread-17  报到
Thread-19  报到
Thread-12  报到
Thread-18  报到
Thread-2  开始报数...
Thread-19  开始报数...
Thread-0  开始报数...
Thread-16  开始报数...
Thread-3  开始报数...
Thread-1  开始报数...
Thread-7  开始报数...
Thread-4  开始报数...
Thread-5  开始报数...
Thread-6  开始报数...
Thread-13  开始报数...
Thread-12  开始报数...
Thread-9  开始报数...
Thread-11  开始报数...
Thread-14  开始报数...
Thread-17  开始报数...
Thread-18  开始报数...
Thread-15  开始报数...
Thread-10  开始报数...
Thread-8  开始报数...
Thread-8  报数完毕!
Thread-2  报数完毕!
Thread-19  报数完毕!
Thread-0  报数完毕!
Thread-16  报数完毕!
Thread-4  报数完毕!
Thread-5  报数完毕!
Thread-7  报数完毕!
Thread-6  报数完毕!
Thread-1  报数完毕!
Thread-3  报数完毕!
Thread-13  报数完毕!
Thread-12  报数完毕!
Thread-11  报数完毕!
Thread-9  报数完毕!
Thread-18  报数完毕!
Thread-17  报数完毕!
Thread-14  报数完毕!
Thread-10  报数完毕!
Thread-15  报数完毕!
Thread-15  归队
Thread-2  归队
Thread-19  归队
Thread-8  归队
Thread-0  归队
Thread-4  归队
Thread-6  归队
Thread-7  归队
Thread-5  归队
Thread-1  归队
Thread-13  归队
Thread-12  归队
Thread-16  归队
Thread-3  归队
Thread-9  归队
Thread-18  归队
Thread-11  归队
Thread-14  归队
Thread-10  归队
Thread-17  归队

 具体其它方法可参考官方API文档

 

 

分享到:
评论

相关推荐

    Java多线程编程实战指南-核心篇

    此外,Phaser、CyclicBarrier和CountDownLatch等同步辅助类也是线程间协调的重要工具。 线程池是Java并发编程中不可或缺的一部分。Executor框架提供了ThreadPoolExecutor,它允许我们预先创建一定数量的线程,管理...

    java10个线程按照顺序打印1-100

    在Java编程中,多线程同步是一个常见的挑战,特别是在需要线程按照特定顺序执行任务时。本主题聚焦于如何使用Java实现10个线程按照顺序打印数字1到100。这种问题通常通过线程间通信和同步机制来解决,如`...

    《软件开发基础(Java)》实验报告-Java多线程编程.docx

    在本实验报告中,我们关注的是Java多线程编程,这是Java编程中一个重要的主题,尤其是在并发处理和高性能系统设计中。线程是操作系统分配CPU时间的基本单位,它允许一个程序内部同时执行多个任务,提高了应用程序的...

    Java多线程应用

    - **CyclicBarrier** 是同步辅助类,允许多个线程等待彼此到达一个屏障点后一起继续执行(thread-t053-jdk1.5-cyclicbarrier)。 - **SingleTaskThreadpool** 涉及到单任务线程池,可能是一种特定场景下的定制化...

    JAVA多线程实现数据库之间的数据互导、连接池、及多表插入数据库功能

    - **线程同步**:为了避免多线程环境中的数据竞争问题,Java提供了synchronized关键字、Lock接口(如ReentrantLock)以及各种同步工具类(如Semaphore、CyclicBarrier)。 - **线程通信**:使用wait()、notify()和...

    Java多线程矩阵相乘的代码

    而"myutil"可能包含了一些辅助工具类,比如矩阵操作相关的类。 在多线程实现矩阵相乘的过程中,我们需要关注以下几个关键点: 1. **任务分解**:根据矩阵的维度合理地划分任务,确保任务大小适中且可以并行化处理...

    Java应用开发多线程

    - **CyclicBarrier/CountDownLatch**:同步辅助类,允许一组线程等待其他线程到达某个点后继续执行。 - **Future/Volatile**:用于处理异步结果和保证变量可见性。 6. **文件名分析**:`JFrameThread.java` `...

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

    CyclicBarrier 是 Java 并发编程中的一个同步辅助工具,它允许一组线程全部等待彼此到达公共屏障点。它的字面意思是可循环使用的屏障,用于让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会...

    java多线程相关

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在并发编程中,多线程技术是实现并行计算、优化资源利用的关键。本篇将深入探讨Java多线程的相关知识,结合《java随笔杂记.doc》...

    多线程精品资源--智能办公OA系统[SpringBoot2-快速开发平台],适用于医院,学校,中小型企业等机构的管理.zip

    4. **并发工具类**:如ConcurrentHashMap、CountDownLatch、CyclicBarrier等,辅助实现高效并发编程。 此外,该系统可能还涵盖了以下关键点: - **权限管理**:基于RBAC(Role-Based Access Control)的角色权限...

    Java多线程赛马游戏Java源码

    - `CountDownLatch`或`CyclicBarrier`:同步辅助类,用于控制多个线程的并发访问,例如所有马匹都准备好后才开始比赛。 总之,通过分析和学习这个"Java多线程赛马游戏"的源码,我们可以深入了解Java多线程编程的...

    张孝祥Java多线程与并发库高级应用视频教程练习代码

    本教程的焦点在于“张孝祥Java多线程与并发库高级应用视频教程”的实践代码,旨在帮助开发者深入理解并熟练掌握这些关键概念。 首先,我们要明确多线程的概念。在单处理器系统中,多线程允许程序同时执行多个任务,...

    Java多线程编程实战指南核新篇&设计篇&以及和核新篇的案例代码

    核心篇主要讲解了Java多线程的基础概念,包括线程的创建与启动、线程同步机制如synchronized关键字、wait()、notify()和notifyAll()方法、线程间通信的并发工具类如Semaphore、CyclicBarrier、CountDownLatch等。...

    java并发工具包 java.util.concurrent中文版-带书签版

    Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...

    Android多线程全新讲解.pdf

    Java多线程高级特性:内容中出现的“ThreadLocal”,“CyclicBarrier”,“CountDownLatch”,“Exchanger”,“ArrayBlockingQueue”,“Lock”,“Condition”和“Semaphore”,这些都是Java 5以后版本引入的高级...

    java多线程并发编程例子

    Java多线程并发编程是Java开发中的重要领域,特别是在服务器端和高并发应用中不可或缺。`java.util.concurrent`包提供了丰富的工具类,帮助开发者更好地管理线程和优化并发性能。以下将详细介绍标题和描述中涉及的...

    java-thread-vedio.rar_java vedio

    - **CyclicBarrier和CountDownLatch**:同步辅助类,用于协调多个线程之间的操作。 4. **线程间的通信**: - **wait()和notify()/notifyAll()**:在同步块中使用,使线程进入等待状态或唤醒等待的线程。 - **...

    java多线程编程实践

    ### Java多线程编程实践 #### 一、`concurrent`包提供的集合 在Java中,`java.util.concurrent`包提供了许多高级并发工具类和容器,这些类在多线程环境中能够有效地提升程序的性能与可靠性。下面详细介绍该包中的...

    多线程的批量线程同步解决方案

    这篇博客文章可能探讨了在Java等语言中实现线程同步的各种策略和工具。 线程同步是为了避免多个线程在同一时刻访问共享资源,导致数据不一致或竞态条件。Java提供了多种同步机制,如synchronized关键字、锁(包括...

    15个顶级JAVA多线程面试题及回答[文].pdf

    由于【部分内容】中提供的信息非常杂乱,缺乏连贯性和上下文,因此下面的知识点将基于Java多线程及并发编程的通用知识点进行构建,以确保满足15个顶级JAVA多线程面试题及回答的知识要求。 首先,在Java多线程面试中...

Global site tag (gtag.js) - Google Analytics