您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 2浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java并发多线程编程——并发工具类Semaphore(信号量)

小志的博客 发布时间:2021-05-31 21:34:43 ,浏览量:2

目录
    • 一、Semaphore的理解
    • 二、Semaphore类中常用方法
    • 三、Semaphore类的使用示例

一、Semaphore的理解
  • Semaphore属于java.util.concurrent包;
  • Semaphore翻译成字面意思为信号量,Semaphore可以控制同时访问的线程个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可。
二、Semaphore类中常用方法

在这里插入图片描述

  • public void acquire() 用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

  • public void acquire(int permits) 获取permits个许可。

  • public void release() 释放许可。注意,在释放许可之前,必须先获得许可。

  • public void release(int permits) 释放permits个许可。 注:以上4个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法。

  • public boolean tryAcquire() 尝试获取一个许可,若获取成功,则立即放回true,若获取失败,则立即返回false

  • public boolean tryAcquire(long timeout, TimeUnit unit) 尝试获取一个许可,若在指定的时间内获取成功,则立即放回true。否则立即返回false

  • public boolean tryAcquire(int permits) 尝试获取permits个许可。若获取成功,则立即放回true,,若获取失败,则立即返回false。

  • public boolean tryAcquire(int permits, long timeout, TimeUnit unit)尝试获取permits个许可。若在指定的时间内获取成功,则立即返回true,否则则立即返回false。

  • 还可以通过availablePermits()方法得到可用的许可数目。

三、Semaphore类的使用示例

使用场景: 停车场容纳总停车量5, 停车场剩余车位不足时,车辆只能在外面等待。 每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。 当一辆车进入停车场后,显示牌的剩余车位数响应的减1.

1、代码

package com.xz.thread.Semaphore;

import java.util.Random;
import java.util.concurrent.Semaphore;

/**
 * @description:  停车场容纳总停车量5,
 *                停车场剩余车位不足时,车辆只能在外面等待。
 *                每有一辆车驶出停车场后,显示牌的剩余车位数响应的加1。
 *                当一辆车进入停车场后,显示牌的剩余车位数响应的减1.
 * @author: xz
 * @create: 2021-05-31 21:03
 */
public class Demo {

    //停车场停车方法
    public void stopCar(Semaphore  semaphore){
        System.out.println(Thread.currentThread().getName()+" 来到停车场。");

        if(semaphore.availablePermits()==0){
            System.out.println("车位不足,请耐心等待。。。。");
        }

        //获取令牌尝试进入停车场
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName()+" 成功进入停车场。");

        //模拟车辆在停车场停留的时间
        try {
            Thread.sleep(new Random().nextInt(5000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName()+" 驶出停车场。");

        //释放令牌,腾出停车场车位
        semaphore.release();

    }

    public static void main(String[] args) {
        Demo d=new Demo();
        //停车场同时容纳的车辆5
        Semaphore semaphore = new Semaphore(5);

        //模拟10辆车进入停车场
        for(int i=1;i            
关注
打赏
1661269038
查看更多评论
0.1431s