中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Java中使用Semaphore工具類

發布時間:2021-06-03 15:51:05 來源:億速云 閱讀:169 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關如何在Java中使用Semaphore工具類,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一、Semaphore的理解

  • Semaphore屬于java.util.concurrent包;

  • Semaphore翻譯成字面意思為信號量,Semaphore可以控制同時訪問的線程個數,通過acquire()獲取一個許可,如果沒有就等待,而release()釋放一個許可。

二、Semaphore類中常用方法

如何在Java中使用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<=10;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    d.stopCar(semaphore);
                }
            },i+"號車").start();
        }
    }
}

2.運行main函數,輸出結果如下:

1號車 來到停車場。
3號車 來到停車場。
3號車 成功進入停車場。
7號車 來到停車場。
1號車 成功進入停車場。
7號車 成功進入停車場。
2號車 來到停車場。
2號車 成功進入停車場。
8號車 來到停車場。
8號車 成功進入停車場。
4號車 來到停車場。
車位不足,請耐心等待。。。。
6號車 來到停車場。
車位不足,請耐心等待。。。。
5號車 來到停車場。
車位不足,請耐心等待。。。。
9號車 來到停車場。
車位不足,請耐心等待。。。。
10號車 來到停車場。
車位不足,請耐心等待。。。。
8號車 駛出停車場。
4號車 成功進入停車場。
4號車 駛出停車場。
6號車 成功進入停車場。
3號車 駛出停車場。
5號車 成功進入停車場。
1號車 駛出停車場。
9號車 成功進入停車場。
7號車 駛出停車場。
10號車 成功進入停車場。
2號車 駛出停車場。
6號車 駛出停車場。
10號車 駛出停車場。
5號車 駛出停車場。
9號車 駛出停車場。
  Process finished with exit code 0。

關于如何在Java中使用Semaphore工具類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

朝阳市| 聊城市| 买车| 屏南县| 芜湖县| 乐亭县| 太原市| 阿瓦提县| 龙里县| 常宁市| 镇赉县| 新乐市| 重庆市| 南城县| 昂仁县| 闽清县| 汕尾市| 沧源| 阿荣旗| 宜都市| 咸阳市| 桃园市| 康平县| 溧阳市| 奉化市| 淮安市| 德惠市| 综艺| 商洛市| 常宁市| 巴彦县| 嘉义市| 嘉义县| 鲁山县| 天气| 渝北区| 鄂尔多斯市| 禹城市| 甘孜| 德保县| 墨江|