我是靠谱客的博主 秀丽墨镜,最近开发中收集的这篇文章主要介绍JUC多线程及高并发-CountDownLatch、CyclicBarrier、Semaphore,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JUC多线程及高并发-计时器

      • CountDownLatch(计数)
          • CountDownLatch 例子
      • CyclicBarrier
          • CyclicBarrier 例子
      • Semaphore (计数信号灯)
          • Semaphore 例子

CountDownLatch(计数)

翻译

一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。

CountDownLatch是用给定的计数初始化的。由于调用countDown()方法,await方法会一直阻塞,直到当前计数达到零,然后释放所有等待的线程,并立即返回任何后续的await调用。这是一种一次性现象——无法重置计数。如果需要重置计数的版本,请考虑使用循环屏障。

倒计时锁存器是一种通用的同步工具,可用于多种用途。使用计数1初始化的CountDownLatch用作一个简单的开/关锁存器或门:所有调用countDown()的线程都在门处等待,直到它被调用countDown()的线程打开。初始化为N的倒计时锁存器可用于使一个线程等待N个线程完成某个操作,或者某个操作已完成N次。

CountDownLatch的一个有用特性是,它不要求调用countDown的线程在继续之前等待计数达到零,它只是防止任何线程通过等待,直到所有线程都可以通过。

位置

在这里插入图片描述
在这里插入图片描述

CountDownLatch 例子
package com.xin;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.concurrent.CountDownLatch;

/**
 * @author :小心仔
 * @date :Created in 2021/11/5 19:35
 * @description:计数器Demo
 */
public class CountDownLatchDemo {


    public static void main(String[] args) throws InterruptedException {

        CountDownLatch countDownLatch = new CountDownLatch(5);

        for (int i = 1; i <= 5; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " 灭亡");
                countDownLatch.countDown();// 减 1
            }, CountryType.getCountryType(i)).start();
        }

        // 停止
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName() + " 国灭亡");

    }

}


enum CountryType {

    ONE(1, "秦国"), TWO(2, "楚国"), THREE(3, "赵国"), FOUR(4, "燕国"), FIVE(5, "柳国");

    private Integer code;
    private String name;

    public static String getCountryType(int code) {
        CountryType[] values = CountryType.values();
        for (CountryType val : values ) {
            if(val.code == code){
                return val.name;
            }
        }
        return null;
    }

    CountryType(int code, String name) {
        this.code = code;
        this.name = name;
    }

    public Integer getCode() {
        return code;
    }

    public String getName() {
        return name;
    }
}

在这里插入图片描述

CyclicBarrier

翻译

一种同步辅助工具,允许一组线程都等待对方到达一个共同的障碍点。CyclicBarrier在涉及固定大小的线程组的程序中很有用,这些线程有时必须互相等待。该屏障被称为循环屏障,因为它可以在释放等待的线程后重新使用。

CyclicBarrier支持可选的Runnable命令,该命令在参与方中的最后一个线程到达后,但在释放任何线程之前,在每个屏障点运行一次。此屏障操作有助于在任何一方继续之前更新共享状态。

位置

在这里插入图片描述

CyclicBarrier 例子
package com.xin;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author :小心仔
 * @date :Created in 2021/11/5 20:00
 * @description:
 */
public class CyclicBarrierDemo {


    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,() -> {
            System.out.println("召唤神龙!");
        });

        for (int i = 1; i <= 7; i++) {
            int ii = i;
            new Thread(() -> {
                System.out.println("召唤" + ii + " 个龙珠");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }

    }

}

在这里插入图片描述

Semaphore (计数信号灯)

翻译

计数信号灯。从概念上讲,信号量维护一组许可。如果需要,每个acquire()都会阻塞,直到有许可证可用,然后再获取它。每次释放()都会添加一个许可证,可能会释放阻止收单机构。但是,没有使用实际的许可证对象;信号量只保留可用数量的计数,并相应地进行操作。

信号量通常用于限制可以访问某些(物理或逻辑)资源的线程数。例如,下面是一个使用信号量控制对项目池访问的类

位置

在这里插入图片描述

Semaphore 例子
package com.xin;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @author :小心仔
 * @date :Created in 2021/11/5 20:11
 * @description:
 */
public class SemaphoreDemo
{


    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3); // 三个车位

        for (int i = 1; i <= 7; i++) { // 模拟7辆汽车
            new Thread(() -> {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + " t 抢到车位");
                    try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace();}
                    System.out.println(Thread.currentThread().getName() + " t 停车 3秒让出车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }


    }
}

在这里插入图片描述

最后

以上就是秀丽墨镜为你收集整理的JUC多线程及高并发-CountDownLatch、CyclicBarrier、Semaphore的全部内容,希望文章能够帮你解决JUC多线程及高并发-CountDownLatch、CyclicBarrier、Semaphore所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部