线程同步辅助类CyclicBarrier

简介:

 CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。

集合点同步:CyclicBarrier

多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才能一起执行下一段任务.

场景:

和朋友组队去游玩,再爬山,在吃饭,再KTV

 

 

第一个人爬山到顶之后要等待其他的三个人也到顶再下山吃饭,

第一个人吃完饭之后要等待之后的三个人也吃晚饭,再去KTV

这四个人相当于四条线程,而这些任务就设定了一一个个的点,这种点称之为集合点.

CyclicBarrier就是在集合点同步.

 

 

CyclicBarrier和CountDownLatch很相似,但是CyclicBarrier有一个reset能回到初始状态, CountDownLatch不可以.

还有一个很明显的区别是, CyclicBarrier同一类线程之间相互等待.

CountDownLatch是其他类线程等待另一类线程来唤醒它们...

 

  CyclicBarrierDemo.java

复制代码
 1 import java.util.Random;
 2 import java.util.concurrent.BrokenBarrierException;
 3 import java.util.concurrent.CyclicBarrier;
 4 import java.util.concurrent.TimeUnit;
 5 
 6 public class CyclicBarrierDemo {
 7 
 8     public static void main(String[] args) {
 9         final CyclicBarrier cb = new CyclicBarrier(4);
10         
11         for (int i = 0; i < 4; i++) {
12             
13             new Thread(new Runnable() {
14                 
15                 @Override
16                 public void run() {
17                     
18                     try {
19                         System.out.println(Thread.currentThread().getName()+" :爬山。。。");
20                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
21                         System.out.println(Thread.currentThread().getName()+" :到达山顶了。。。");
22                         cb.await();//await 就是集合点  等待,直到计数器变为0为止
23                         
24                         System.out.println(Thread.currentThread().getName()+" :吃饭。。。");
25                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
26                         System.out.println(Thread.currentThread().getName()+" :吃完饭了。。。");
27                         cb.await();//等待,直到计数器变为0为止
28                         
29                         System.out.println(Thread.currentThread().getName()+" :KTV。。。");
30                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
31                         System.out.println(Thread.currentThread().getName()+" :唱完歌了。。。");
32                         cb.await();//等待,直到计数器变为0为止
33                         
34                         System.out.println(Thread.currentThread().getName()+":回家");
35                         
36                     } catch (InterruptedException e) {
37                         e.printStackTrace();
38                     } catch (BrokenBarrierException e) {
39                         e.printStackTrace();
40                     }
41                     
42                 }
43             }).start();
44         }
45         
46     }
47 }
复制代码

 运行结果:

复制代码
Thread-0 :爬山。。。
Thread-2 :爬山。。。
Thread-1 :爬山。。。
Thread-3 :爬山。。。
Thread-2 :到达山顶了。。。
Thread-1 :到达山顶了。。。
Thread-0 :到达山顶了。。。
Thread-3 :到达山顶了。。。
Thread-3 :吃饭。。。
Thread-2 :吃饭。。。
Thread-0 :吃饭。。。
Thread-1 :吃饭。。。
Thread-3 :吃完饭了。。。
Thread-2 :吃完饭了。。。
Thread-1 :吃完饭了。。。
Thread-0 :吃完饭了。。。
Thread-0 :KTV。。。
Thread-2 :KTV。。。
Thread-3 :KTV。。。
Thread-1 :KTV。。。
Thread-3 :唱完歌了。。。
Thread-1 :唱完歌了。。。
Thread-0 :唱完歌了。。。
Thread-2 :唱完歌了。。。
Thread-2:回家
Thread-3:回家
Thread-1:回家
Thread-0:回家
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6206265.html,如需转载请自行联系原作者

相关文章
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
169 2
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
195 1
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
207 1
|
12月前
|
Java
【JavaEE】——多线程常用类
Callable的call方法,FutureTask类,ReentrantLock可重入锁和对比,Semaphore信号量(PV操作)CountDownLatch锁存器,
|
12月前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
12月前
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
245 3
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
250 2
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
203 2
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
308 1

热门文章

最新文章