Java並發編程之工具類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<=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的使用的文章就介紹到這瞭,更多相關Java工具類Semaphore內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: