栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间:发布时间: 百科书网 趣学号
并发工具类-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();
            }
        }
    }
}

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/275544.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号