`

CyclicBarrier

阅读更多

在javaSE5中,CyclicBarrier是一个同步辅助类,允许一组线程相互等待直到全部到达某个“屏障".它是循环的

用在你希望创建一组人物,它们并行地执行,在下一个步骤之前同时等待,直到之前所有的人物都完成,以保证它们可以一致的前进。

下面一个小例子:赛马仿真

package com.my.thread.concurrent;

import java.util.*;
import java.util.concurrent.*;

/**CyclicBarrier可重置计数
 * 赛马仿真
 * @author laotan
 *
 */
public class CyclicBarrierDemo {

	public static void main(String[] args) {
		
		int nHorses = 7 ; //七匹马
		int pause = 100 ;
		new HorseRace(nHorses, pause) ;
	}
}

class Horse implements Runnable {
	
	private static int counter = 0 ;
	private final int id = counter ++ ;
	private int strides =0 ;
	private static Random rand = new Random(47) ;
	private static CyclicBarrier barrier ;
	
	public Horse(CyclicBarrier cb) {
		this.barrier = cb ;
	}
	
	public synchronized int getStrides() {
		return strides ;
	}
	
	public void run() {
		try {
			while(!Thread.interrupted()) {
				synchronized (this) {
				
					strides += rand.nextInt(3) ;
				}
				barrier.await() ;//阻塞,直到计数值为0
			}
		} catch(InterruptedException e) {
			
		} catch(BrokenBarrierException e) {
			throw new RuntimeException(e) ;
		}
	}
	
	public String toString() {
		return "Horse " + id + " " ;
	}
	
	public String tracks() {//仿真奔跑
		StringBuilder s = new StringBuilder() ;
		for(int i=0; i<getStrides(); i++)
			s.append("*") ;
		s.append(id) ;
		return s.toString() ;
	}
}

class HorseRace {
	
	public static final int FINISHI_LINE = 70 ;//赛程
	private List<Horse> horses = new ArrayList<Horse>() ;
	private CyclicBarrier barrier ;
	private ExecutorService ex = Executors.newCachedThreadPool() ;
	/**
	 * 
	 * @param nHorses:参与比赛的数目
	 * @param pause:赛程
	 */
	public HorseRace(int nHorses, final int pause) {
		barrier = new CyclicBarrier(nHorses, new Runnable() {
			//向CyclicBarrier提供一个“屏障", 当计数值到达0时自动执行,并且是可以循环的,直到线程关闭
			public void run() {
				StringBuilder s = new StringBuilder() ;
				for(int i=0; i< FINISHI_LINE; i++)
					s.append("=") ;
				System.out.println(s);
				for(Horse h : horses)
					System.out.println(h.tracks());
				for(Horse h : horses) {
					if(h.getStrides() >= FINISHI_LINE) {
						System.out.println(h + "won!");
						ex.shutdownNow() ;
						return ;
					}
					try {
						TimeUnit.MILLISECONDS.sleep(pause) ;
					} catch(InterruptedException e) {
						System.out.println("Barrier-action sleep interrupted");
					}
				}
			}
		}) ;
		for(int i=0; i<nHorses; i++) {
			Horse h = new Horse(barrier) ;
			horses.add(h) ;
			ex.execute(h) ;
		}
	}
}
 
0
2
分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...

    CyclicBarrier的用法

    在Java多线程编程中,`CyclicBarrier`是一个非常重要的同步工具类,它允许一组线程等待其他线程到达某个屏障点后再一起继续执行。这个屏障点就是我们所说的“循环栅栏”,顾名思义,它就像一个旋转门,所有线程必须...

    CyclicBarrier的使用以及注意事项

    CyclicBarrier的使用以及注意事项

    CyclicBarrier,reentrantlock,condition模拟抢票

    用CyclicBarrier,reentrantlock,condition来完成同时购买,同步购买的功能 JUC系列之模拟抢票(N人同时抢票,票不足系统补仓,N-M人继续抢票) http://blog.csdn.net/crazyzxljing0621/article/details/77891620

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

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    CyclicBarrier用法.docx

    CyclicBarrier是Java并发编程中一个非常重要的工具类,它属于java.util.concurrent包,主要用于多线程间的协作,尤其在需要多个线程等待彼此完成特定任务后才能继续执行的场景中发挥着关键作用。CyclicBarrier的名字...

    Java中的CyclicBarrier类最全讲义

    # Java中的CyclicBarrier类最全讲义 ## 1. 简介 ### 1.1 并发编程与线程协作 在现代软件开发中,特别是高性能计算领域,利用多核处理器的能力变得至关重要。为了充分利用这些硬件资源,程序员们开始广泛采用并发...

    JAVA CyclicBarrier类详解.docx

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

    28 人齐了,一起行动—CyclicBarrier详解.pdf

    CyclicBarrier 是 Java 并发库中的一种同步工具类,用于协调多个线程之间的协作,使得它们能够一起开始某个计算任务或操作。它的名称“CyclicBarrier”来源于它具有可重用的特点,即当所有等待的线程都达到指定的...

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

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

    Java并发系列之CyclicBarrier源码分析

    Java并发系列之CyclicBarrier源码分析 CyclicBarrier是Java并发系列中的一种同步工具类,用于实现一组线程相互等待。当所有线程都到达某个屏障点后,再进行后续的操作。下面是对CyclicBarrier源码的详细分析。 ...

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

    在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具,用于协调多个线程之间的交互。它们都属于java.util.concurrent包下的类,为多线程编程提供了强大的支持。 **CountDownLatch** 是一个...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    ### CountDownLatch 和 CyclicBarrier 的运用(含AQS详解) #### CountDownLatch **定义与特点:** CountDownLatch 是 Java 并发包中的一个重要组件,它主要用于解决“一个或多个线程等待其他线程完成任务”的问题。...

    Java并发实例之CyclicBarrier的使用

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

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

    Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...

    CyclicBarrier(处理方案示例).md

    CyclicBarrier(处理方案示例).md

    java多线程之CyclicBarrier的使用方法

    Java多线程之CyclicBarrier的使用方法 Java多线程之CyclicBarrier的使用方法是Java多线程编程中的一种同步机制,用于实现多个线程之间的同步协作。CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待...

    java.CyclicBarrier(解决方案).md

    java.CyclicBarrier(解决方案).md

    Java中CyclicBarrier的用法分析

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

Global site tag (gtag.js) - Google Analytics