`
hy2012_campus
  • 浏览: 30567 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

线程同步辅助CyclicBarrier类

    博客分类:
  • java
 
阅读更多

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

public class JavaCyclicBarrierExample {
	
	public static void main(String[] args) {
		//3 threads are part of the barrier, ServiceOne, ServiceTwo and this main thread calling them.
		final CyclicBarrier barrier = new CyclicBarrier(3);
		
		Thread serviceOneThread = new Thread(new ServiceOne(barrier));
		Thread serviceTwoThread = new Thread(new ServiceTwo(barrier));
		
		System.out.println("Starting both the services at"+new Date());
		
		serviceOneThread.start();
		serviceTwoThread.start();
		
		try {
			barrier.await();
		} catch (InterruptedException e) {
			System.out.println("Main Thread interrupted!");
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			System.out.println("Main Thread interrupted!");
			e.printStackTrace();
		}
		System.out.println("Ending both the services at"+new Date());
	}
}

  

public class ServiceOne implements Runnable {

	private final CyclicBarrier cyclicBarrier;

	public ServiceOne(CyclicBarrier cyclicBarrier) {
		this.cyclicBarrier = cyclicBarrier;
	}
	public void run() {
		System.out.println("Starting service One...");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		System.out.println("Service One has finished its work... waiting for others...");
		try {
			cyclicBarrier.await();
		} catch (InterruptedException e) {
			System.out.println("Service one interrupted!");
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			System.out.println("Service one interrupted!");
			e.printStackTrace();
		}
		System.out.println("The wait is over, lets complete Service One!");
	}
}

 

public class ServiceTwo implements Runnable {
	private final CyclicBarrier cyclicBarrier;
	
	public ServiceTwo(CyclicBarrier cyclicBarrier) {
		this.cyclicBarrier = cyclicBarrier;
	}
	public void run() {
		System.out.println("Starting service Two....");
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		System.out.println("Service Two has finished its work.. waiting for others...");
		try {
			cyclicBarrier.await();
		} catch (InterruptedException e) {
			System.out.println("Service one interrupted!");
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			System.out.println("Service one interrupted!");
			e.printStackTrace();
		}
		System.out.println("The wait is over, lets complete Service two!");
	}
}

 另外一个实例:

public class CyclicBarrierTest {

    public static void main(String[] args) throws IOException, InterruptedException {
        CyclicBarrier barrier = new CyclicBarrier(3);

        ExecutorService executor = Executors.newFixedThreadPool(3);
        executor.submit(new Thread(new Runner(barrier, "1号选手")));
        executor.submit(new Thread(new Runner(barrier, "2号选手")));
        executor.submit(new Thread(new Runner(barrier, "3号选手")));

        executor.shutdown();
    }
}

class Runner implements Runnable {
    // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
    private CyclicBarrier barrier;

    private String name;

    public Runner(CyclicBarrier barrier, String name) {
        super();
        this.barrier = barrier;
        this.name = name;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1000 * (new Random()).nextInt(8));
            System.out.println(name + " 准备好了...");
            // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
            barrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        System.out.println(name + " 起跑!");
    }
}

 

分享到:
评论

相关推荐

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

    4. **CountDownLatch**:这是一个一次性使用的同步辅助类,用于让一组线程等待其他线程完成操作。在批量处理中,主线程可能使用CountDownLatch来等待所有子线程完成任务,然后继续执行后续操作。 5. **...

    JAVA CyclicBarrier类详解.docx

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

    Java多线程开发之CyclicBarrier

     CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用,其相当...

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

    CyclicBarrier是一个同步辅助类,允许一组线程等待其他线程到达一个公共屏障点。在所有线程到达屏障点后,屏障会释放,所有线程继续执行。CyclicBarrier在多线程排序场景中起到了关键作用,确保所有线程完成排序后再...

    Java中的5种同步辅助类介绍

    Java中的同步辅助类是用于控制并发执行和线程间协作的重要工具,它们提供了比`synchronized`关键字和`wait/notify`机制更为高级和灵活的同步机制。以下将详细介绍五种常用的同步辅助类: 1. **Semaphore(信号量)*...

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

    5. **CountDownLatch**:`java.util.concurrent.CountDownLatch`是另一种同步辅助类,它允许一个或多个线程等待其他线程完成操作。在顺序打印的例子中,可以设置计数器为100,每个线程打印一个数字后减少计数器,...

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

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

    Java多线程矩阵相乘的代码

    2. **线程同步**:为了避免数据竞争,可能需要用到synchronized关键字或者java.util.concurrent包下的高级同步机制,如Semaphore或CyclicBarrier。 3. **线程安全的数据结构**:如果线程之间需要共享数据,必须确保...

    Android多线程全新讲解.pdf

    CyclicBarrier是一种同步辅助,用于让一组线程互相等待,直到全部到达某个公共点后才能继续执行;CountDownLatch可以用于一个线程等待其他线程完成各自的任务;Exchanger用于两个线程之间交换对象;...

    线程面试题

    - `CountDownLatch`是一个一次性使用的同步辅助类,它允许一个或多个线程等待其他线程完成操作。 - `CyclicBarrier`可以重复使用,当等待的线程达到指定数量时,所有线程会被释放继续执行,并可以再次进入等待状态...

    JAVA100例之实例61JAVA双线程

    5. Phaser:Java并发库提供的一个同步辅助类,允许多个线程进行协作,完成一系列阶段性的任务。 6. CountDownLatch:计数器,初始化为一个整数值,线程调用countDown()方法时计数值减1,所有线程都在await()处等待...

    多线程concurrent的用例

    5. **CyclicBarrier和CountDownLatch**: 这两个是同步辅助类,用于协调多线程间的协作。`CyclicBarrier`允许一组线程等待所有线程到达屏障点后再继续执行,可以循环使用;`CountDownLatch`则是一个一次性使用的...

    Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    首先,CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达一个特定的屏障点。CyclicBarrier的名字来源于它的可重用性,当所有线程都到达屏障点后,屏障会自动重置,允许下一轮的线程同步。...

    Java并发实例之CyclicBarrier的使用

    在多线程编程中,CyclicBarrier可以用来实现线程间的同步,例如在王者荣耀中,五个玩家需要同时到达打大龙的地点,才能开始战斗。在这个场景中,可以使用CyclicBarrier来实现线程间的同步。 CyclicBarrier的使用...

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

    6. `CyclicBarrier`和`CountDownLatch`:同步辅助类,前者用于让一组线程等待其他线程到达某个点后再继续执行,后者允许一个线程或一组线程等待其他线程完成操作后再继续。 7. `Atomic*`类:原子操作类,如`...

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

    CyclicBarrier是允许一组线程互相等待达到某个共同点后再继续执行的同步辅助类。 第四,关于死锁问题的讨论也是Java多线程面试的一个重要环节。面试者需要能够理解死锁产生的条件,即互斥条件、请求与保持条件、不...

    Java多线程赛马游戏Java源码

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

    并发工具类及线程池1

    CyclicBarrier是一个Java并发包(java.util.concurrent)中的同步辅助类,其主要功能是让一组线程相互等待,直到所有线程都达到一个共同点(也称为屏障点)后,才一起继续执行。这个特性在多线程协作处理问题时非常...

    Java实监控同步的代码

    4. ** LockSupport 工具类**:此工具类提供了线程阻塞和唤醒的基础功能,可以配合Condition对象使用,实现更复杂的线程同步和协作。 5. ** java.util.concurrent.locks.Condition**:Condition接口提供了比...

    java多线程相关

    - `CountDownLatch`计数器:一次性使用的同步辅助类,倒计数后所有等待线程被释放。 - `CyclicBarrier`循环栅栏:一组线程等待所有线程到达屏障点后一起继续。 - `Phaser`:更灵活的栅栏,可以动态添加和移除参与...

Global site tag (gtag.js) - Google Analytics