CountDownLatch
- 让一些线程阻塞直到另外一些线程完成一系列的操作后才被唤醒
- 主要有两个方法,当一个或者多个线程调用await方法时,调用线程会被阻塞。当其他线程调用countDown方法会将计数器减1, 调用countDown方法的线程不会阻塞,当计数器的值变为0时,因调用await方法被阻塞的线程会被唤醒,继续执行。 ```java package com.interview.demo;
import org.checkerframework.checker.units.qual.C;
import java.util.concurrent.CountDownLatch;
/**
- @Author leijs
@date 2022/3/29 */ public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(7);
for (int i = 1; i <= 7; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t 上完自习离开教室");
countDownLatch.countDown();
}, String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "\t 班长最后关门走人");
} }
<a name="chVuN"></a>
## CyclicBarrier
是可循环使用的屏障。它要做的事情是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await方法。
```java
package com.interview.demo;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* @Author leijs
* @date 2022/3/29
*/
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("***************召唤神龙");
});
for (int i = 0; i < 7; i++) {
int finalI = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "收集到第" + finalI + "龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
Semaphore
信号量的主要目的:一个用户多个共享资源的互斥使用,另一个是用户并发线程数的控制。
-
构造方法
public Semaphore(int permits)
public Semaphore(int permits, boolean fair)
解析: permits 表示许可线程的数量
fair 表示公平性,如果这个设为 true 的话,下次执行的线程会是等待最久的线程
重要方法
public void acquire() throws InterruptedException
public void release()
解析:acquire() 表示阻塞并获取许可
- release() 表示释放许可 ```java package com.interview.demo;
import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;
/**
- @Author leijs
- @date 2022/3/29
*/
public class SemaphoreDemo {
public static void main(String[] args) {
} }// 模拟三个停车位
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 7; i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "抢到车位");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + "停车3秒离开车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}, "t" + i).start();
}
```