小白的JUC学习09_常用辅助类

JUC下的常用辅助类


1.1、ConutDownLancuh


一、ConutDownLancuh介绍

ConutDownLancuh是一个用于计数的线程类,类似倒计时,当然单单计数肯定是没意义的,所以还要搭配一个方法,下面介绍

二、使用

主要的两个方法:

  • CountDownLatch对象的countDown()方法:计数减一
  • CountDownLatch对象的await()方法
    • 当计数线程不为0时,将一直等待下去,直到被唤醒
package com.migu;

import java.util.concurrent.*;

/**
 * 实现一个当所有线程都执行完毕时,再下一步的场景
 */
public class Test {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
		CountDownLatch count = new CountDownLatch(5);  // 创建一个总共计数5次的线程
       
        for (int i = 1; i <= 5; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + "go out");
                count.countDown(); // 减 1
            },String.valueOf(i)).start();
        }

        count.await();
        System.out.println("完毕");
    }
}

输出:

1.2、CyclicBarrier


一、CyclicBarrier介绍

CyclicBarrier也是可以指定Count并对其计数的线程,并且还可以自己创建一个线程

二、使用

主要两个方法:

  • CyclicBarrier:存在两个构造器,有一个构造器可以创建一个线程
  • CyclicBarrier对象的await()方法
    • 等待一次,都会对count减一,当为0时,执行内部携带的任务,并重新对count初始化
package com.migu;

import java.util.concurrent.*;

/**
 * 实现一个当所有线程都执行完毕时,再下一步的场景
 */
public class Test {

    public static void main(String[] args) {

        CyclicBarrier barrier = new CyclicBarrier(7, () -> {
            System.out.println("召唤神龙");
        });
        for (int i = 1; i <= 6; i++) {
            final int temp = i; // 按照我目前的理解是,JDK1.8常量池存放堆中,是线程共享的
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + ": 第" + temp + "龙珠");
                try {
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }

    }
}

1.3、SemaPhore

一、SemaPhore介绍

SemaPhore依然位于java.util.concurrent包下

  • 表示一个信号量类,信号量是操作系统的一个专业术语,我在前面提到过
    • 说白了就是可以设置多把锁,支持限定数量的线程同时执行

二、使用

Semaphore构造器实现主要用于指定信号量

  • 空惨构造函数,默认的锁采用的是非公平锁
  • 获取锁的方法:acquire()
  • 释放锁的方法:release()
package com.migu;

import java.util.concurrent.*;

/**
 * 实现一个可以同时执行 n个数量的线程场景
 */
public class Test {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(2); // 只有两把锁
        for (int i = 1; i <= 4; i++) {
            final int temp = i;
            new Thread(()->{
                try {
                    semaphore.acquire();  // 拿到了锁才能进入以下代码
                    System.out.println(Thread.currentThread().getName() + "抢到了: " + temp  + "车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release(); // 释放锁
                    System.out.println(Thread.currentThread().getName() + "离开: " + temp  + "车位");
                }
            },String.valueOf(i)).start();
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值