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 {

    1. CountDownLatch countDownLatch = new CountDownLatch(7);
    2. for (int i = 1; i <= 7; i++) {
    3. new Thread(() -> {
    4. System.out.println(Thread.currentThread().getName() + "\t 上完自习离开教室");
    5. countDownLatch.countDown();
    6. }, String.valueOf(i)).start();
    7. }
    8. countDownLatch.await();
    9. System.out.println(Thread.currentThread().getName() + "\t 班长最后关门走人");

    } }

  1. <a name="chVuN"></a>
  2. ## CyclicBarrier
  3. 是可循环使用的屏障。它要做的事情是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await方法。
  4. ```java
  5. package com.interview.demo;
  6. import java.util.concurrent.BrokenBarrierException;
  7. import java.util.concurrent.CyclicBarrier;
  8. /**
  9. * @Author leijs
  10. * @date 2022/3/29
  11. */
  12. public class CyclicBarrierDemo {
  13. public static void main(String[] args) {
  14. CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
  15. System.out.println("***************召唤神龙");
  16. });
  17. for (int i = 0; i < 7; i++) {
  18. int finalI = i;
  19. new Thread(() -> {
  20. System.out.println(Thread.currentThread().getName() + "收集到第" + finalI + "龙珠");
  21. try {
  22. cyclicBarrier.await();
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. } catch (BrokenBarrierException e) {
  26. e.printStackTrace();
  27. }
  28. }).start();
  29. }
  30. }
  31. }

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) {
    1. // 模拟三个停车位
    2. Semaphore semaphore = new Semaphore(3);
    3. for (int i = 0; i < 7; i++) {
    4. new Thread(() -> {
    5. try {
    6. semaphore.acquire();
    7. System.out.println(Thread.currentThread().getName() + "抢到车位");
    8. TimeUnit.SECONDS.sleep(3);
    9. System.out.println(Thread.currentThread().getName() + "停车3秒离开车位");
    10. } catch (InterruptedException e) {
    11. e.printStackTrace();
    12. } finally {
    13. semaphore.release();
    14. }
    15. }, "t" + i).start();
    16. }
    } }

```