`

java CyclicBarrier 实例

阅读更多

多个线程等待

 

多个线程共同的等待一个操作(N-1),可以多次使用这个barrier对象,他不同于cutdownlatch锁,他可以多次重复使用

 

以下为实例:

 

package com.common;

import java.util.Random;  
import java.util.concurrent.CyclicBarrier;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.regex.Pattern;
  
  
public class CyclicBarrierTest {  
  
    public static void main(String[] args) { 
    	String value = "-43.23";
    	String reg = "^(-?\\d+)(\\.\\d+)?$";
    	Pattern pattern = Pattern.compile(reg); //正则
    	pattern.matcher(value).toString();
    	
        final CyclicBarrier barrier = new CyclicBarrier(10, new Runnable(){  
            public void run() {  
                System.out.println("大部队集合完毕了。");  
                try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
            }  
              
        });  
          
        ExecutorService executor = Executors.newFixedThreadPool(10);  
        for(int i = 0; i<10; i++){  
            final int num = i;  
            executor.execute(new Runnable(){  
                public void run() {  
                    System.out.println("num: " + num + " 从公司出发了.");  
                    try {  
                        Thread.sleep(new Random().nextInt(1000));  
                        barrier.await(); // 在西湖等待大部队  
                      
                        System.out.println("num: " + num + " 在西湖开始游玩.");  
                          
                        Thread.sleep(new Random().nextInt(2000));  
                        barrier.await(); //等待大部队就餐  
                    } catch (Exception e1) {  
                    }                     
                }                 
            });  
        }  
  
        executor.shutdown();  
    }  
}  

    主要的逻辑都在一个函数中

 
private int dowait(boolean timed, long nanos)
        throws InterruptedException, BrokenBarrierException,
               TimeoutException {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            final Generation g = generation;

            if (g.broken)
                throw new BrokenBarrierException();

            if (Thread.interrupted()) {
                breakBarrier();
                throw new InterruptedException();
            }

           int index = --count;                        //lock锁计数器递减
           if (index == 0) {                            // tripped,当计数器为0时,
               boolean ranAction = false;        //调用barrier行为,并通知所有等待的线程
               try {
		   final Runnable command = barrierCommand;
                   if (command != null)
                       command.run(); //调用barrier行为
                   ranAction = true;   
                   nextGeneration(); //通知所有await的线程,使用condition对象的signlAll方法
                   return 0;
               } finally {
                   if (!ranAction)
                       breakBarrier();
               }
           }

            // loop until tripped, broken, interrupted, or timed out
            for (;;) {
                try {
                    if (!timed)                                                            //是否有超时操作
                        trip.await();                                                     //调用condition对象的await方法
                    else if (nanos > 0L)                                
                        nanos = trip.awaitNanos(nanos);
                } catch (InterruptedException ie) {
                    if (g == generation && ! g.broken) {
                        breakBarrier();
			throw ie;
		    } else {
			// We're about to finish waiting even if we had not
			// been interrupted, so this interrupt is deemed to
			// "belong" to subsequent execution.
			Thread.currentThread().interrupt();
		    }
                }

                if (g.broken)
                    throw new BrokenBarrierException();

                if (g != generation)
                    return index;

                if (timed && nanos <= 0L) {
                    breakBarrier();
                    throw new TimeoutException();
                }
            }
        } finally {
            lock.unlock();
        }
    }
分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

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

    Java并发实例之CyclicBarrier的使用

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

    140个Java源码实例

    15. **并发编程**:Java提供了丰富的并发工具类,如CountDownLatch、CyclicBarrier、Semaphore等,实例将展示如何高效地管理并发任务。 通过逐一研究这些源码实例,不仅可以加深对Java语言的理解,还能提升实际编程...

    JAVA经典实例.chm

    5. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、同步机制(synchronized关键字、wait()、notify()和notifyAll()方法)以及并发工具类(如Semaphore、CyclicBarrier等)。 6. **网络编程*...

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

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

    java多线程之CyclicBarrier的使用方法

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

    Java高级编程实例 100个

    本资源“Java高级编程实例 100个”提供了丰富的实践案例,旨在帮助初学者深入理解并熟练应用这些高级特性。 1. **多线程**:在Java中,多线程是并发执行任务的基本方式。学习如何创建Thread类的子类,使用Runnable...

    java高级编程100实例

    10. **并发工具**:如CountDownLatch、CyclicBarrier、Semaphore等,这些工具可以帮助构建复杂的并发程序,实例可能展示如何有效使用它们。 11. **Java 8及以后的新特性**:如Lambda表达式、Stream API、Optional类...

    JAVA多线程的实例

    Java并发包`java.util.concurrent`提供了高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(回环栅栏)、`CountDownLatch`(计数器门闩)等,它们可以更灵活地控制线程执行。例如,`CountDownLatch`常用于...

    Java经典实例(第2版) pdf和源代码

    《Java经典实例(第2版)》是一本深入浅出的Java编程教程,它涵盖了Java语言的各个方面,旨在帮助读者掌握Java编程的核心技能,并通过实际的示例加深理解。PDF书籍部分提供了详尽的理论解释和清晰的代码展示,而源代码...

    java JDK 实例开发宝典 源代码

    Java JDK实例开发宝典源代码是一份非常宝贵的资源,它涵盖了Java开发中的各种核心概念和技术。JDK(Java Development Kit)是Java编程的基础,包含了Java运行环境、编译器、调试器以及各种工具,是每个Java开发者...

    java多线程编程实例_Source

    Java并发包提供了如CountDownLatch、CyclicBarrier、Semaphore等并发工具类,用于协调多个线程间的协作。这些工具在分布式计算、并行任务调度等领域有广泛应用。 通过这些实例,学习者能够深入理解Java多线程编程,...

    JAVA100例之实例64 JAVA线程间通讯

    在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...

    Java中的CyclicBarrier类最全讲义

    要使用`CyclicBarrier`,首先需要创建一个实例对象。在构造函数中,我们需要指定参与线程的数量以及当所有线程都到达屏障点时所要执行的操作(如果有的话)。这是一个典型的使用示例: ```java import java.util....

    SUN公司的java实例代码

    15. **并发工具**:如Semaphore、CyclicBarrier、ExecutorService等,这些工具在多线程编程中非常有用,实例可能有它们的应用。 通过研究这些" SUN公司的java实例手册 ",无论是初学者还是经验丰富的开发者,都能...

    java代码实例项目

    这里可能需要用到Java的并发工具类,如CountDownLatch或者CyclicBarrier。 4. **利息计算**:根据银行的利率策略,定期计算并添加到账户余额中。这可能涉及到时间间隔的处理,可以使用Java的定时任务框架如...

    Java中CyclicBarrier的用法分析

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

    基于Java的实例开发源码-HAHA CHAT Java仿QQ聊天程序源代码.zip

    该压缩包文件“基于Java的实例开发源码-HAHA CHAT Java仿QQ聊天程序源代码.zip”包含了一个使用Java编程语言开发的聊天程序实例,名为"HAHA CHAT",其设计灵感来源于著名的即时通讯软件QQ。这个项目旨在帮助学习者...

    Java安全性编程实例.

    此外,还可以使用java.util.concurrent包下的工具类,如Semaphore、CyclicBarrier和ExecutorService等,来更好地管理和控制并发。 四、异常处理 在安全性编程中,良好的异常处理是必不可少的。Java的try-catch-...

    java线程实例,赛跑小游戏

    5. **并发工具类**:Java 5及更高版本引入了`java.util.concurrent`包,提供了一系列并发工具,如`CountDownLatch`、`CyclicBarrier`、`Semaphore`等。这些工具可以帮助管理线程间的协调,例如在所有参赛者准备好后...

Global site tag (gtag.js) - Google Analytics