
countDownLatch举例说明
public class countDownlatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for(int i=0;i<5;i++){
new Thread(new readNum(i,countDownLatch)).start();
}
countDownLatch.await();
System.out.println("线程执行结束。。。。");
}
static class readNum implements Runnable{
private int id;
private CountDownLatch latch;
public readNum(int id,CountDownLatch latch){
this.id = id;
this.latch = latch;
}
@Override
public void run() {
synchronized (this){
System.out.println("id:"+id);
latch.countDown();
System.out.println("线程组任务"+id+"结束,其他任务继续");
}
}
}
}
运行结果如下
id:0
id:1
线程组任务1结束,其他任务继续
线程组任务0结束,其他任务继续
id:2
线程组任务2结束,其他任务继续
id:4
线程组任务4结束,其他任务继续
id:3
线程组任务3结束,其他任务继续
线程执行结束。。。。
cyclicBarrier举例如下
package com.hanshow.testThread;
import java.util.concurrent.CyclicBarrier;
/**
* PROJECT_NAME:downLoad
* Author:lucaifang
* Date:2016/3/18
*/
public class cyclicBarrierTest {
public static void main(String[] args) throws InterruptedException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("线程组执行结束");
}
});
for (int i = 0; i < 5; i++) {
new Thread(new readNum(i,cyclicBarrier)).start();
}
Thread.sleep(5000);
//CyclicBarrier 可以重复利用,
// 这个是CountDownLatch做不到的
for (int i = 11; i < 16; i++) {
new Thread(new readNum(i,cyclicBarrier)).start();
}
}
static class readNum implements Runnable{
private int id;
private CyclicBarrier cyc;
public readNum(int id,CyclicBarrier cyc){
this.id = id;
this.cyc = cyc;
}
@Override
public void run() {
System.out.println("id:"+id);
try {
cyc.await();
System.out.println("线程组任务" + id + "结束,其他任务继续");
} catch (Exception e) {
e.printStackTrace();
}
/*synchronized (this){
System.out.println("id:"+id);
try {
cyc.await();
System.out.println("线程组任务" + id + "结束,其他任务继续");
} catch (Exception e) {
e.printStackTrace();
}
}*/
}
}
}
id:0
id:2
id:3
id:1
id:4
线程组执行结束
线程组任务4结束,其他任务继续
线程组任务2结束,其他任务继续
线程组任务1结束,其他任务继续
线程组任务3结束,其他任务继续
线程组任务0结束,其他任务继续
id:11
id:12
id:13
id:14
id:15
线程组执行结束
线程组任务15结束,其他任务继续
线程组任务11结束,其他任务继续
线程组任务12结束,其他任务继续
线程组任务14结束,其他任务继续
线程组任务13结束,其他任务继续
扩展

本文通过实例详细对比了Java并发编程中CountDownLatch和CyclicBarrier两种同步工具的使用方法及特点。CountDownLatch用于等待一组操作完成,而CyclicBarrier则允许一组线程相互等待直到到达某个公共屏障点。
800

被折叠的 条评论
为什么被折叠?



