#### CountDownLatch
CountDownLatch对象指定一个基数,每次执行countDown()方法,基数减一,直到这个基数为0时,执行await()方法后的代码。一般await用于主方法中。
- 构造器方法
```
构造器:
CountDownLatch(int num); // 给定义的CountDownLatch指定一个数值
方法:
await(); // 等待直到传入CountDownLatch对象中数值为0,再执行后面代码。
await(long time, TimeUnit timeUnit); // 设置等待超时时间,如果再规定时间内CountDownLatch对象中数值没有为0,则报错,CountDownLatch失效。
countDown(); // 传入CountDownLatch对象中数值减一
```
- 例子
```
public void CountDownLatchTest(){
int threadCount = 4;
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < threadCount; i++) {
executorService.execute(new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
System.out.println("当前线程"+Thread.currentThread().getName()+"执行完毕");
}
}));
}
executorService.shutdown();
System.out.println("等待线程执行完毕.....");
countDownLatch.await();
System.out.println("所有线程执行完");
}
```
#### CyclicBarrier
CyclicBarrier对象指定一个基数,每次执行await()方法时,基数减一,直到这个基数为0时,执行await()方法后的代码。一般await用于线程方法中。
- 构造器方法
```
构造器:
CyclicBarrier(int num); // 给定义的CountDownLatch指定一个数值
CyclicBarrier(int num, Runnable r); // 给定义的CountDownLatch指定一个数值, 第二个参数指当基数为0时,创建一个线程参数为r的线程并执行,直到该线程执行结束后开始执行await方法后面的代码
方法:
await(); // 每次执行await()方法时,传入CyclicBarrier基数num减一,直到num为0,才执行await方法后续的代码。
await(long time, TimeUnit timeUnit); // 同await方法,设定了等待的超时时间,如果超时,则会报超时错误,并且CyclicBarrier失效。
```
- 例子
```
public void CyclicBarrierTeset(){
for(int i = 0 ; i < 10 ; i++) {
Thread.sleep(1000);
new Thread(() ->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行");
try {
cyclicBarrier.await();
} catch (BrokenBarrierException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("达到定义数目,wait方法后代码执行");
}).start();
}
System.in.read();
}
```
- 2111总结
- 1.面向对象
- 1.0.1 super()与this()的区别
- 1.0.2 private、default、protected、public的访问范围
- 1.0.3 continue、break、return区别
- 1.0.4 重载和重写的区别
- 1.0.5 final的特点
- 1.0.6 抽象类与接口的区别
- 1.0.7 java类型
- 1.0.8 什么是反射
- 1.0.9 类的加载机制
- 1.1.1 jvm内存结构
- 1.1.2 java垃圾回收机制
- 1.1.3 并发问题
- 1.1.3.1 线程的状态与关系
- 1.1.3.2 并发的三大性质
- 1.1.3.3 线程的实现与使用
- 1.1.3.4 线程池相关
- 1.1.3.5 并发相关方法
- 1.1.3.6 线程相关工具
- 1.1.4 jdk8特性
- 1.1.4.1 lambad表达式的使用
- 1.1.4.2 stream API
- 1.1.4.3 Optional容器使用
- 1.1.4.4 LocalDateTime
- 1.15 io流
- 1.16 动态代理实现
- 2.JavaEE
- 2.0.1 JSP四大作用域九大内置对象
- 2.0.2 cookie与session的区别
- 4.数据库相关
- 5.git版本管理
- 7.一些问题解决
- 7.1 分布式锁如何实现