barrier phaser

一、CyclicBarr一、CyclicBarrier

    CyclicBarrier拥有CountDownLatch的功能(CountDownLatch的介绍请看我的另一篇博客: Java并发编程——Semaphore (信号量)和CountDownLatch ),任何一个线程在没有完成时,所有线程都在等待。有点类似于屏障的意思,比如百米赛跑,需要等所有运动员都到达起跑线后,裁判才会鸣枪,这个“起跑线”就是屏障,每个运动员就是一个个线程,而“裁判鸣枪”就是后需要做的一些事情。

上栗子:

public static void main(String[] args) {
final CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
//执行所有线程全部完成后的逻辑
try {
System.out.println(“执行所有线程全部完成后的逻辑 开始”);
Thread.sleep(3000);
System.out.println(“执行所有线程全部完成后的逻辑 结束”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//子线程数量
int threadNum = 4;
for (int i = 0; i < threadNum; i++) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(“开始” + finalI);
cyclicBarrier.await();
System.out.println(“结束” + finalI);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}).start();
}
}

简单粗暴,直接看log:
12-19 15:19:28.470 18459-18635/? I/System.out: 开始0
12-19 15:19:28.470 18459-18636/? I/System.out: 开始1
12-19 15:19:28.470 18459-18637/? I/System.out: 开始2
12-19 15:19:28.470 18459-18638/? I/System.out: 开始3

接下来改变线程数量:

//子线程数量
int threadNum = 5;

再次运行看log:

12-19 15:22:27.810 22580-22713/lbx.myapplication I/System.out: 开始0
12-19 15:22:27.810 22580-22715/lbx.myapplication I/System.out: 开始2
12-19 15:22:27.810 22580-22714/lbx.myapplication I/System.out: 开始1
12-19 15:22:27.810 22580-22716/lbx.myapplication I/System.out: 开始3
12-19 15:22:27.820 22580-22717/lbx.myapplication I/System.out: 开始4
12-19 15:22:27.820 22580-22717/lbx.myapplication I/System.out: 执行所有线程全部完成后的逻辑 开始
//睡了三秒
12-19 15:22:30.820 22580-22717/lbx.myapplication I/System.out: 执行所有线程全部完成后的逻辑 结束
12-19 15:22:30.820 22580-22717/lbx.myapplication I/System.out: 结束4
12-19 15:22:30.820 22580-22713/lbx.myapplication I/System.out: 结束0
12-19 15:22:30.820 22580-22715/lbx.myapplication I/System.out: 结束2
12-19 15:22:30.820 22580-22714/lbx.myapplication I/System.out: 结束1
12-19 15:22:30.820 22580-22716/lbx.myapplication I/System.out: 结束3

常用方法:
//在此方法处线程阻塞,n个线程都执行await()后回调Runnable里的逻辑
cyclicBarrier.await();
//阻塞到3秒后则抛出TimeoutException异常,不会继续向下执行
cyclicBarrier.await(3, TimeUnit.SECONDS);
//获得到达await()(屏障)的线程的数量
cyclicBarrier.getNumberWaiting();
//当前线程的屏障是否出现损坏,例如终止线程的时候
cyclicBarrier.isBroken();
//获取屏障的数量:n
cyclicBarrier.getParties();
//重置屏障
cyclicBarrier.reset();

二、Phaser

    与CyclicBarrier功能重叠,任何一个线程在没有完成时,所有线程都在等待。

public static void main(String[] args) {
final Phaser phaser = new Phaser(5) {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
//当所有线程都完成了一个任务的时候,会回调。
System.out.println(“完成了第” + phase + “个屏障”);
//true:后面的屏障无效。false:保持屏障的有效性
return false;
}
};
//线程数量
int threadNum = 5;
for (int i = 0; i < threadNum; i++) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(“开始” + finalI);
Thread.sleep(1000);
//与CyclicBarrier相同,都是等待所有线程到达屏障后,再统一释放
phaser.arriveAndAwaitAdvance();
System.out.println(“结束” + finalI);
} catch (InterruptedException e) {
eier

    CyclicBarrier拥有CountDownLatch的功能(CountDownLatch的介绍请看我的另一篇博客: Java并发编程——Semaphore (信号量)和CountDownLatch ),任何一个线程在没有完成时,所有线程都在等待。有点类似于屏障的意思,比如百米赛跑,需要等所有运动员都到达起跑线后,裁判才会鸣枪,这个“起跑线”就是屏障,每个运动员就是一个个线程,而“裁判鸣枪”就是后需要做的一些事情。

上栗子:

public static void main(String[] args) {
final CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
//执行所有线程全部完成后的逻辑
try {
System.out.println(“执行所有线程全部完成后的逻辑 开始”);
Thread.sleep(3000);
System.out.println(“执行所有线程全部完成后的逻辑 结束”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//子线程数量
int threadNum = 4;
for (int i = 0; i < threadNum; i++) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(“开始” + finalI);
cyclicBarrier.await();
System.out.println(“结束” + finalI);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}).start();
}
}

简单粗暴,直接看log:
12-19 15:19:28.470 18459-18635/? I/System.out: 开始0
12-19 15:19:28.470 18459-18636/? I/System.out: 开始1
12-19 15:19:28.470 18459-18637/? I/System.out: 开始2
12-19 15:19:28.470 18459-18638/? I/System.out: 开始3

接下来改变线程数量:

//子线程数量
int threadNum = 5;

再次运行看log:

12-19 15:22:27.810 22580-22713/lbx.myapplication I/System.out: 开始0
12-19 15:22:27.810 22580-22715/lbx.myapplication I/System.out: 开始2
12-19 15:22:27.810 22580-22714/lbx.myapplication I/System.out: 开始1
12-19 15:22:27.810 22580-22716/lbx.myapplication I/System.out: 开始3
12-19 15:22:27.820 22580-22717/lbx.myapplication I/System.out: 开始4
12-19 15:22:27.820 22580-22717/lbx.myapplication I/System.out: 执行所有线程全部完成后的逻辑 开始
//睡了三秒
12-19 15:22:30.820 22580-22717/lbx.myapplication I/System.out: 执行所有线程全部完成后的逻辑 结束
12-19 15:22:30.820 22580-22717/lbx.myapplication I/System.out: 结束4
12-19 15:22:30.820 22580-22713/lbx.myapplication I/System.out: 结束0
12-19 15:22:30.820 22580-22715/lbx.myapplication I/System.out: 结束2
12-19 15:22:30.820 22580-22714/lbx.myapplication I/System.out: 结束1
12-19 15:22:30.820 22580-22716/lbx.myapplication I/System.out: 结束3

常用方法:
//在此方法处线程阻塞,n个线程都执行await()后回调Runnable里的逻辑
cyclicBarrier.await();
//阻塞到3秒后则抛出TimeoutException异常,不会继续向下执行
cyclicBarrier.await(3, TimeUnit.SECONDS);
//获得到达await()(屏障)的线程的数量
cyclicBarrier.getNumberWaiting();
//当前线程的屏障是否出现损坏,例如终止线程的时候
cyclicBarrier.isBroken();
//获取屏障的数量:n
cyclicBarrier.getParties();
//重置屏障
cyclicBarrier.reset();

二、Phaser

    与CyclicBarrier功能重叠,任何一个线程在没有完成时,所有线程都在等待。

public static void main(String[] args) {
final Phaser phaser = new Phaser(5) {
@Override
protected boolean onAdvance(int phase, int registeredParties) {
//当所有线程都完成了一个任务的时候,会回调。
System.out.println(“完成了第” + phase + “个屏障”);
//true:后面的屏障无效。false:保持屏障的有效性
return false;
}
};
//线程数量
int threadNum = 5;
for (int i = 0; i < threadNum; i++) {
final int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(“开始” + finalI);
Thread.sleep(1000);
//与CyclicBarrier相同,都是等待所有线程到达屏障后,再统一释放
phaser.arriveAndAwaitAdvance();
System.out.println(“结束” + finalI);
} catch (InterruptedException e) {
e

猜你喜欢

转载自blog.csdn.net/u014162993/article/details/112975618