欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java并發(fā)編程之Semaphore的使用簡介

 更新時間:2021年04月20日 09:55:58   作者:布禾  
這篇文章主要介紹了Java并發(fā)編程之Semaphore的使用簡介,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

簡介

Semaphore是用來限制訪問特定資源的并發(fā)線程的數(shù)量,相對于內(nèi)置鎖synchronized和重入鎖ReentrantLock的互斥性來說,Semaphore可以允許多個線程同時訪問共享資源。

Semaphored的使用

構(gòu)造方法

Semaphore(int permits):創(chuàng)建Semaphore,并指定許可證的數(shù)量。(公平策略為非公平)

Semaphore(int permits, boolean fair):創(chuàng)建Semaphore,并指定許可證的數(shù)量和公平策略。

核心方法

acquire():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證或者當(dāng)前線程被中斷。

acquire(int permits):從Semaphore中獲取指定數(shù)量的許可證,如果獲取不到則阻塞等待,直到其他線程釋放了對應(yīng)數(shù)量的許可證或者當(dāng)前線程被中斷。

acquireUninterruptibly():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證。(不響應(yīng)中斷)

tryAcquire():嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則返回false,不會進行等待。(不受公平策略的影響,許可證可用則立即獲得)

tryAcquire(long timeout, TimeUnit unit):嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則等待指定的時間,直到等待時間結(jié)束還是沒有獲取到許可證則返回false。

release():釋放一個許可證。

release(int permits):釋放指定數(shù)量的許可證。

示例

總共有5個許可證,最先獲取到許可證的5個線程開始執(zhí)行任務(wù),沒獲取到的線程進入等待狀態(tài),直到獲取到許可證的線程釋放許可證后,再獲取許可證執(zhí)行任務(wù)。

public class Demo {

    public static void main(String[] args) {
        //創(chuàng)建許可證數(shù)量為5的Semaphore
        Semaphore semaphore = new Semaphore(5);

        Runnable runnable = () -> {
            String threadName = Thread.currentThread().getName();
            try{
                //獲取一個許可證
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)...");
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //釋放一個許可證
                semaphore.release();
            }
        };

        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for(int i = 0; i < 10; i++){
            executorService.execute(runnable);
        }

        executorService.shutdown();
    }

}

/* 開始輸出:
 * pool-1-thread-1執(zhí)行任務(wù)...
 * pool-1-thread-5執(zhí)行任務(wù)...
 * pool-1-thread-6執(zhí)行任務(wù)...
 * pool-1-thread-7執(zhí)行任務(wù)...
 * pool-1-thread-3執(zhí)行任務(wù)...
 * 三秒后輸出:
 * pool-1-thread-4執(zhí)行任務(wù)...
 * pool-1-thread-8執(zhí)行任務(wù)...
 * pool-1-thread-2執(zhí)行任務(wù)...
 * pool-1-thread-10執(zhí)行任務(wù)...
 * pool-1-thread-9執(zhí)行任務(wù)...
 */

使用Semaphore實現(xiàn)互斥

使用Semaphore實現(xiàn)互斥只需要將許可證數(shù)量設(shè)置為1,這樣就可以保證只有一個線程能獲取到許可證。

Semaphore semaphore = new Semaphore(1);

相比內(nèi)置鎖synchronized和重入鎖ReentrantLock,使用Semaphore實現(xiàn)互斥有個明顯的缺點:不可重入,沒有釋放許可證的情況下,再次調(diào)acquire方法將導(dǎo)致死鎖。

示例:

public class Demo {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(1);

        Runnable runnable = () -> {
            String threadName = Thread.currentThread().getName();
            try {
                //獲取一個許可證
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)A...");
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)B...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //釋放一個許可證
                semaphore.release();
            }
        };

        new Thread(runnable).start();
    }

}

/*
 * 輸出結(jié)果:
 * Thread-0執(zhí)行任務(wù)A...
 */

“執(zhí)行任務(wù)B”永遠(yuǎn)不會打印,因為許可證只有一個,第二次acquire方法的調(diào)用會因為無法獲取到許可證而一直阻塞。

以上就是Java并發(fā)編程之Semaphore的使用簡介的詳細(xì)內(nèi)容,更多關(guān)于Java并發(fā)編程之Semaphore的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JVM加載一個類的過程

    JVM加載一個類的過程

    本文主要介紹了JVM加載一個類的過程。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java咖啡館(1)——嘆咖啡

    Java咖啡館(1)——嘆咖啡

    這篇文章主要給大家介紹了關(guān)于Java咖啡館之嘆咖啡,需要的朋友可以參考下
    2006-12-12
  • 使用Java填充Word模板的方法詳解

    使用Java填充Word模板的方法詳解

    Java填充Word模板是一種將動態(tài)數(shù)據(jù)插入到Word文檔模板中生成最終文檔的過程,通常用于批量創(chuàng)建包含個人信息、報告結(jié)果或其他動態(tài)內(nèi)容的文檔,本文給大家介紹了使用Java填充Word模板的方法,需要的朋友可以參考下
    2024-07-07
  • Java如何基于反射獲取對象屬性信息

    Java如何基于反射獲取對象屬性信息

    這篇文章主要介紹了Java如何基于反射獲取對象屬性信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • java利用JEXL實現(xiàn)動態(tài)表達式編譯

    java利用JEXL實現(xiàn)動態(tài)表達式編譯

    這篇文章主要介紹了java利用JEXL實現(xiàn)動態(tài)表達式編譯,系統(tǒng)要獲取多個數(shù)據(jù)源的數(shù)據(jù),并進行處理,最后輸出多個字段。字段的計算規(guī)則一般是簡單的取值最多加一點條件判斷,下面是具體的實現(xiàn)方法
    2021-04-04
  • Spring結(jié)合WebSocket實現(xiàn)實時通信的教程詳解

    Spring結(jié)合WebSocket實現(xiàn)實時通信的教程詳解

    WebSocket?是基于TCP/IP協(xié)議,獨立于HTTP協(xié)議的通信協(xié)議,本文將使用Spring結(jié)合WebSocket實現(xiàn)實時通信功能,有需要的小伙伴可以參考一下
    2024-01-01
  • Java彈簧布局管理器使用方法詳解

    Java彈簧布局管理器使用方法詳解

    這篇文章主要介紹了Java彈簧布局管理器使用方法詳解,需要的朋友可以參考下
    2017-09-09
  • SpringBoot之Java配置的實現(xiàn)

    SpringBoot之Java配置的實現(xiàn)

    這篇文章主要介紹了SpringBoot之Java配置的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java使用阿里云接口進行身份證實名認(rèn)證的示例實現(xiàn)

    Java使用阿里云接口進行身份證實名認(rèn)證的示例實現(xiàn)

    這篇文章主要介紹了使用阿里云接口進行身份證實名認(rèn)證的示例實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 簡單分析Java的求值策略原理

    簡單分析Java的求值策略原理

    在本篇文章里小編給大家整理的是一篇關(guān)于簡單分析Java的求值策略原理內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-06-06

最新評論