溫馨提示×

溫馨提示×

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

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

如何在Java中使用Semaphore工具類

發(fā)布時間:2021-06-03 15:51:05 來源:億速云 閱讀:157 作者:Leah 欄目:開發(fā)技術(shù)

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

一、Semaphore的理解

  • Semaphore屬于java.util.concurrent包;

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

二、Semaphore類中常用方法

如何在Java中使用Semaphore工具類

  • public void acquire() 用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許可。

  • public void acquire(int permits) 獲取permits個許可。

  • public void release() 釋放許可。注意,在釋放許可之前,必須先獲得許可。

  • public void release(int permits) 釋放permits個許可。

  • 注:以上4個方法都會被阻塞,如果想立即得到執(zhí)行結(jié)果,可以使用下面幾個方法。

  • public boolean tryAcquire() 嘗試獲取一個許可,若獲取成功,則立即放回true,若獲取失敗,則立即返回false

  • public boolean tryAcquire(long timeout, TimeUnit unit) 嘗試獲取一個許可,若在指定的時間內(nèi)獲取成功,則立即放回true。否則立即返回false

  • public boolean tryAcquire(int permits) 嘗試獲取permits個許可。若獲取成功,則立即放回true,,若獲取失敗,則立即返回false。

  • public boolean tryAcquire(int permits, long timeout, TimeUnit unit)嘗試獲取permits個許可。若在指定的時間內(nèi)獲取成功,則立即返回true,否則則立即返回false。

  • 還可以通過availablePermits()方法得到可用的許可數(shù)目。

三、Semaphore類的使用示例

使用場景:
停車場容納總停車量5,
停車場剩余車位不足時,車輛只能在外面等待。
每有一輛車駛出停車場后,顯示牌的剩余車位數(shù)響應(yīng)的加1。
當一輛車進入停車場后,顯示牌的剩余車位數(shù)響應(yīng)的減1.

1.代碼

package com.xz.thread.Semaphore;

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

/**
 * @description:  停車場容納總停車量5,
 *                停車場剩余車位不足時,車輛只能在外面等待。
 *                每有一輛車駛出停車場后,顯示牌的剩余車位數(shù)響應(yīng)的加1。
 *                當一輛車進入停車場后,顯示牌的剩余車位數(shù)響應(yīng)的減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函數(shù),輸出結(jié)果如下:

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。

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

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI