多个线程等待
多个线程共同的等待一个操作(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(); } }
相关推荐
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
主要介绍了Java并发实例之CyclicBarrier的使用,涉及CyclicBarrier的介绍,以及相关的并发实例,具有一定参考价值,需要的朋友可以了解下。
主要介绍了java多线程之CyclicBarrier的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。
主要介绍了Java并发编程之栅栏(CyclicBarrier)实例介绍,栅栏类似闭锁,但是它们是有区别的,需要的朋友可以参考下
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
Concurrent下的例子,涵盖了大部分常用类 例如BlockingQueue、CountDownLatch、CyclicBarrier、Exchanger、ExecuteService、lock、timeutil等
主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下
同步控制是并发程序必不可少的重要手段,本文我们将通过重入锁、读写锁、信号量、倒计数器和循环栅栏以及他们的实例来介绍Java并发程序中的同步控制。 目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ...
CyclicBarrier 可以让一定数量的参与线程反复地在栅栏位置汇集 应用场景在并行迭代算法中非常有用 Exchanger 这是一种两方栅栏,各方在栅栏位置上交换数据。 应用场景:当...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
第1章 初识Java 3 1.1 Java简介 3 1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 Java的特点 4 1.2 安装开发工具包 5 1.2.1 下载JDK 5 1.2.2 安装JDK 6 1.2.3 安装后Java目录的解读 7 1.3...
synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序开多少线程合适; 实现一下DCL(双重检查锁) stream 和 parallelStream区别; 实现一个阻塞队列(用...