java线程基础之CyclicBarrier学习
2018-03-07 09:39
148 查看
CyclicBarrier相关API
解释
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的
import java.util.concurrent.BrokenBarrierExc
9434
eption;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
static CyclicBarrier cyc= new CyclicBarrier(2);
public static void main(String[] args) {
CyclicBarrier cyc = new CyclicBarrier(3,new Runnable() {
@Override
public void run() {
System.out.println("thread end");
}
});
for (int i = 0; i < 3; i++) {
new Thread(new CycRun(i, cyc)).start();
}
}
static class CycRun implements Runnable{
private int id;
private CyclicBarrier cyc;
public CycRun(int i,CyclicBarrier cyc){
this.id=i;
this.cyc=cyc;
}
@Override
public void run() {
System.out.println("this id is"+id);
try {
cyc.await();
System.out.println("thread work end "+id);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
执行结果:
await() 在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 | |
await(long timeout, TimeUnit unit) 在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。 | |
getNumberWaiting() 返回当前在屏障处等待的参与者数目。 | |
getParties() 返回要求启动此 barrier 的参与者数目。 | |
isBroken() 查询此屏障是否处于损坏状态。 | |
reset() 将屏障重置为其初始状态。 |
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的
Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。个人白话理解: cycliBarrier就像我们去5.1去玩摩天轮。摩天轮一次做多少人是一定的 只有在入场的人达到满额时候才开启,在旋转一定时间内所有人统一出去,等待下一波。而cyclibarrier也是一样在执行await()后 cycliBarrier计数开始每次加1 只有在达到初始化时指定的计数之后才能执行其他方法Demopackage test.Threae;
import java.util.concurrent.BrokenBarrierExc
9434
eption;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
static CyclicBarrier cyc= new CyclicBarrier(2);
public static void main(String[] args) {
CyclicBarrier cyc = new CyclicBarrier(3,new Runnable() {
@Override
public void run() {
System.out.println("thread end");
}
});
for (int i = 0; i < 3; i++) {
new Thread(new CycRun(i, cyc)).start();
}
}
static class CycRun implements Runnable{
private int id;
private CyclicBarrier cyc;
public CycRun(int i,CyclicBarrier cyc){
this.id=i;
this.cyc=cyc;
}
@Override
public void run() {
System.out.println("this id is"+id);
try {
cyc.await();
System.out.println("thread work end "+id);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
执行结果:
相关文章推荐
- java基础---->线程 生产者消费者问题
- Java基础之线程——派生自Thread类的子类(TryThread)
- 线程之一:JAVA线程基础
- 黑马程序元-java基础 线程间通讯
- java基础—线程入门
- 线程操作,比 handler更简单的AsyncTask 使用详解-基础java线程
- java基础---JAVA中线程的作用
- 【Java基础】线程笔记—— 线程协作
- Java线程基础一
- Java基础-多线程-①线程的创建和启动
- 黑马程序员——Java语言基础——04.多线程(2)线程间通信
- [Java基础] Java线程复习笔记
- java多线程基础(3)-调度方式之暂停当前线程方式2-放弃
- Java基础15:进程间和线程间的通信方式
- Java基础的IO和线程知识
- Java基础学习 —— 线程
- java线程---基础(一)
- java基础学习总结-----线程(一)
- Java并发基础(一)-线程基础
- 【java并发】基础(1)--创建线程的两种方法