java多线程工具类的使用-------CountDownLatch、Semaphore

并发工具类-CountDownLatch
  • 应用场景:在有多个线程的情况下,让某一个线程等其他线程运行完后再运行。
  • 构造方法;
    • public CountDownLatch(int count) :参数传递线程数,表示等待线程数量,表示构造一个用给定计数初始化的CountDownLatch。
  • 操作方法:
    • public void await() :让线程等待,当锁存器的计数为0时,就运行该线程
    • public void countDown() :当前线程执行完毕,递减锁存器的计数
  • 代码示例;
package _线程工具类;

import java.util.concurrent.CountDownLatch;

public class Main2 {
    public static void main(String[] args) throws InterruptedException {
    	//让线程1和2运行完后,再运行线程3
        //参数传递线程数,需要传递给2个线程。
        //在底层就定义了一个计数器,此时计数器的值就是2
        CountDownLatch countDownLatch = new CountDownLatch(2);
        //开始线程1
        new Thread(()->{
            System.out.println("线程1开启");
            System.out.println("线程1结束");
            //每一次countDown方法的时候,就让计数器-1
            countDownLatch.countDown();
        }).start();

        //使用countDownLatch.await();等待的线程,等待其他两个线程运行完,再运行
        //等1,2线程运行完后。开启线程3
        new Thread(()->{
            try {
                //当计数器变成0的时候,会自动唤醒这里等待的线程。
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("等待的线程3开启");
        }).start();
        //开启线程2
        new Thread(()->{
            System.out.println("线程2开启");
            System.out.println("线程2结束");
            ///每一次countDown方法的时候,就让计数器-1
            countDownLatch.countDown();
        }).start();
    }
}

在这里插入图片描述

并发工具类-Semaphore
  • 应用场景:可以控制访问特定资源的线程数量。
  • 构造方法;
    • public Semaphore(int permits) :创建具有给定数量permits的许可证
  • 操作方法:
    • public void acquire():获得许可证(如果有)并立即返回,将可用许可证的数量减少一个
    • public void release() :释放许可证,将可用许可证的数量增加一个。
  • 代码场景例子
  1. 需要有人管理这个通道
  2. 当有车进来了,发通行许可证
  3. 当车出去了,收回通行许可证
  4. 如果通行许可证发完了,那么其他车辆只能等着
  • 代码实现示例:
package _线程工具类;

import java.util.concurrent.Semaphore;

public class Main3 {
    public static void main(String[] args) throws InterruptedException {
        MyRunnable mr = new MyRunnable();
        //存在10辆车等待通行证
        for (int i = 0; i < 10; i++) {
            new Thread(mr).start();
        }
    }
    static class MyRunnable implements Runnable {
        //1.获得管理员对象,
        private Semaphore semaphore = new Semaphore(2);
        @Override
        public void run() {
            //2.获得通行证
            try {
                semaphore.acquire();
            //3.开始行驶
                System.out.println("获得了通行证开始行驶");
                Thread.sleep(2000);
                System.out.println("归还通行证");
            //4.归还通行证
                semaphore.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值