我是靠谱客的博主 怕孤单蜗牛,最近开发中收集的这篇文章主要介绍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();
            }
        }
    }
}

在这里插入图片描述

最后

以上就是怕孤单蜗牛为你收集整理的java多线程工具类的使用-------CountDownLatch、Semaphore的全部内容,希望文章能够帮你解决java多线程工具类的使用-------CountDownLatch、Semaphore所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部