`

java锁之CyclicBarrier(互相等待,直到大家都做完,一起开始下面)

    博客分类:
  • java
 
阅读更多

参考文章:http://blog.csdn.net/lmc_wy/article/details/7866863 (闭锁CountDownLatch与栅栏CyclicBarrier)

所有线程互相等待,直到大家都到达一个水平线上,大家在继续运行,这个水平线就是栅栏。

栅栏:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。利用栅栏,可以使线程相互等待,直到所有线程都到达某一点,然后栅栏将打开,所有线程将通过栅栏继续执行。CyclicBarrier支持一个可选的 Runnable 参数,当线程通过栅栏时,runnable对象将被调用。构造函数CyclicBarrier(int parties, Runnable barrierAction),当线程在CyclicBarrier对象上调用await()方法时,栅栏的计数器将增加1,当计数器为parties时,栅栏将打开。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {

	public static void main(String[] args) {
	            final int count = 5;  
	            final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {  
	                @Override  
	                public void run() {  
	                    System.out.println("大家都跑完了!");  
	                }  
	            });  
	            for (int i = 0; i < count; i++) {  
	                new Thread(new Worker(i, barrier)).start();  
	            }  
	        }  
}  
	      
class Worker implements Runnable {  
    final int id;  
    final CyclicBarrier barrier;  
  
    public Worker(final int id, final CyclicBarrier barrier) {  
        this.id = id;  
        this.barrier = barrier;  
    }  
  
    @Override  
    public void run() {  
        try {  
            System.out.println(this.id + "starts to run !");  
            Thread.sleep((long) (Math.random() * 10000));  
            System.out.println(this.id + "arrived !");  
	                this.barrier.await();  //跑到这个地方等待
	                System.out.println(this.id+"--end--time:{"+System.currentTimeMillis()+"}");
	            } catch (InterruptedException e) {  
	                e.printStackTrace();  
	            } catch (BrokenBarrierException e) {  
	                e.printStackTrace();  
	            }  
	        } 
	        
}

 运行结果:

0starts to run !
1starts to run !
2starts to run !
3starts to run !
4starts to run !
1arrived !
4arrived !
3arrived !
0arrived !
2arrived !
大家都跑完了!
2--end--time:{1469688224243}
1--end--time:{1469688224243}
3--end--time:{1469688224243}
4--end--time:{1469688224243}
0--end--time:{1469688224243}

 再来一个例子,从线程池拿5个线程,这些线程启动后同时去干一件事情,用CyclicBarrier实现

public static void main(String[] args) {
		final CyclicBarrier barrier=new CyclicBarrier(5);
	    ExecutorService  service= Executors.newFixedThreadPool(5);
	    for(int i=0;i<5;i++){
	    	service.execute(new Runnable() {
				@Override
				public void run() {
					try {
						long wait=(long)(Math.random()*10000);
						System.out.println(wait); 
						Thread.sleep(wait); //模拟线程启动耗时
						barrier.await(); //等待大家都启动
						System.out.println("start time :"+System.currentTimeMillis());   //大家同时开始干活
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
	    }
	    }

 

分享到:
评论

相关推荐

    Java中的CyclicBarrier类最全讲义

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

    Java并发实例之CyclicBarrier的使用

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

    java多线程之CyclicBarrier的使用方法

    CyclicBarrier是Java 5中引入的一种同步机制,用于让多个线程等待到达一个共同的屏障点,直到所有线程都到达该点后,所有线程才能继续执行。 Java多线程之CyclicBarrier的使用方法主要有以下几个方面: 1. 创建...

    Java并发系列之CyclicBarrier源码分析

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

    Java多线程--等待所有子线程执行完的五种方法.docx

    本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`方法 尽管不推荐,但可以通过`Thread.sleep()`方法让主线程休眠一段时间来等待子线程。这种方法的问题在于,睡眠时间必须预估...

    Java锁机制详解.pdf

    Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...

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

    CountDownLatch适用于需要等待一组操作完成的场景,而CyclicBarrier适用于需要多个线程协同工作,直到所有线程都到达某个公共点后再一起执行的场景。在实际开发中,我们应该根据具体的应用场景选择合适的同步工具,...

    CyclicBarrier的用法

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

    JAVA CyclicBarrier类详解.docx

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

    CountDownLatch和CyclicBarrier用法实例大全

    CyclicBarrier则更像一个障碍,它允许一组线程彼此等待,直到所有的线程都到达屏障点后,一起继续执行。与CountDownLatch不同,CyclicBarrier可以重置,因此可以多次使用。 1. **初始化**: 通过`CyclicBarrier(int ...

    Java中CyclicBarrier的用法分析

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

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

    在Java并发编程中,CountDownLatch和CyclicBarrier都是用于协调多线程间同步的重要工具,它们可以帮助开发者在特定条件满足时启动或者结束线程的执行。本文将详细探讨这两个类的内部实现机制以及它们在实际应用场景...

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

    **CyclicBarrier** 另一方面,CyclicBarrier允许一组线程等待其他线程到达屏障点,然后一起继续执行。它的名称中的"Cyclic"表示屏障是可以重用的,即一旦所有线程都到达屏障点,屏障会被重置,线程可以再次等待。在...

    java多线程之并发锁

    Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...

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

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

    Java 等待唤醒机制 代码优化

    在Java编程中,线程的等待唤醒机制是多线程编程中的重要概念,它涉及到如何有效地协调多个线程之间的交互,以确保程序的正确运行。本文将深入探讨这个主题,并提供一些代码优化的建议,适合Java初学者进行学习和参考...

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

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

Global site tag (gtag.js) - Google Analytics