最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程信號量Semapher

 更新時間:2022年04月15日 16:24:59   作者:派大大大星?  
這篇文章主要介紹了Java并發(fā)編程信號量Semapher,Semapher信號量也是Java中的一個同步器,下文關(guān)于信號量Semapher的更多內(nèi)容介紹,需要的小伙伴可以參考下面文章

Semapher信號量也是Java中的一個同步器,與CountDownLatch和CycleBarrier不同的是,它內(nèi)部的計數(shù)器是遞增的,并且在一開始初始化Semaphoer時可以指定一個初始值,但是并不需要知道需要同步的線程個數(shù),而是在需要同步的地方調(diào)用acquire方法時指定需要同步的線程個數(shù)。

我們通過下面一個例子來看一下Semapher效果:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreTest {

    private static Semaphore semaphore = new Semaphore(0);
    public static void main(String[] args) throws InterruptedException{
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread() + "over");
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread() + "over");
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        semaphore.acquire(2);
        System.out.println("all child thread over!");
        executorService.shutdown();

    }
}

image.png

如上代碼首先創(chuàng)建了一個信號量實例,構(gòu)造函數(shù)的入?yún)?,說明當前信號量計數(shù)器的值為0。然后,main函數(shù)向線程池添加兩個線程任務(wù),在每個線程內(nèi)部調(diào)用信號量的acquire方法,傳參為2說明調(diào)用acquire方法的線程會一直阻塞,知道信號量的技術(shù)變?yōu)?才會返回。如果構(gòu)造Semaphore時,傳遞的參數(shù)為N,并在M個線程中調(diào)用了該信號量的release方法,那么在調(diào)用acquire使M個線程同步時傳遞的參數(shù)應(yīng)該是M+N。

下面舉例子來模擬CycliBarrier復(fù)用的功能,代碼如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class Semaphoer {

    private static Semaphore semaphore = new Semaphore(0);
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread() + "A task over");
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread() + "A task over");
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        semaphore.acquire(2);
        System.out.println("task A is over");
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread() + "B task over");
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread() + "B task over");
                    semaphore.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        semaphore.acquire(2);
        System.out.println("task B is over");
        executorService.shutdown();

    }
}

image.png

如上代碼首先將線程A和線程B加入到線程池。主線程執(zhí)行代碼(1)后被阻塞。線程A和線程B調(diào)用release方法后信號量的值變?yōu)榱?,這時候主線程的aquire方法會在獲取到2個信號量后返回(返回后當前信號量值為0)。然后主線程添加線程C和線程D到線程池,之后主線程執(zhí)行代碼(2)后被阻塞(因為主線程要獲取2個信號量,而當前信號量個數(shù)為0)。當線程C和線程D執(zhí)行完release 方法后,主線程才返回。從本例子可以看出,Semaphore 在某種程度上實現(xiàn)了CyclicBarrier 的復(fù)用功能。

到此這篇關(guān)于Java并發(fā)編程信號量Semapher的文章就介紹到這了,更多相關(guān)Java Semapher內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot定時任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實現(xiàn)方法

    SpringBoot定時任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實現(xiàn)方法

    本篇文章主要介紹了SpringBoot定時任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實現(xiàn)方法,詳細的介紹了Spring Schedule 與 Quartz 整合的兩種方法,有興趣的可以了解一下。
    2017-03-03
  • AJAX省市區(qū)三級聯(lián)動下拉菜單(java版)

    AJAX省市區(qū)三級聯(lián)動下拉菜單(java版)

    這篇文章主要介紹了AJAX省市區(qū)三級聯(lián)動下拉菜單(java版)的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • 淺談Java基于Consul創(chuàng)建分布式鎖

    淺談Java基于Consul創(chuàng)建分布式鎖

    這篇文章主要介紹了淺談基于Consul創(chuàng)建分布式鎖,Consul是HashiCorp公司推出的開源工具,用于實現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置Consul是分布式的、高可用的、可橫向擴展的,需要的朋友可以參考下
    2023-07-07
  • Java樹形結(jié)構(gòu)遞歸查詢方式

    Java樹形結(jié)構(gòu)遞歸查詢方式

    文章介紹了Java中實現(xiàn)樹形結(jié)構(gòu)遞歸查詢的方法,首先找出所有的根節(jié)點,然后通過循環(huán)遍歷根節(jié)點,找到每個根節(jié)點的子節(jié)點,最終構(gòu)建完整的樹形結(jié)構(gòu),這是一種有效的遞歸查詢思路,適用于需要層次化展示數(shù)據(jù)的場景
    2024-12-12
  • Java新API的時間格式化

    Java新API的時間格式化

    這篇文章主要介紹了Java新API的時間格式化,新的時間API的時間格式化由java.time.format.DateTimeFormatter負責,更多相關(guān)資料需要的小伙伴可以參考一下
    2022-05-05
  • java實現(xiàn)獲取安卓設(shè)備里已安裝的軟件包

    java實現(xiàn)獲取安卓設(shè)備里已安裝的軟件包

    本文給大家介紹的是如何獲取設(shè)備中已經(jīng)安裝的應(yīng)用軟件包的代碼,其核心方法原理很簡單,我們通過Android中提供的PackageManager類,來獲取手機中安裝的應(yīng)用程序信息
    2015-10-10
  • Java8中Lambda表達式的理解與應(yīng)用

    Java8中Lambda表達式的理解與應(yīng)用

    Java8最值得學(xué)習的特性就是Lambda表達式和Stream?API,如果有python或者javascript的語言基礎(chǔ),對理解Lambda表達式有很大幫助,下面這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達式的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • java中Lamda表達式講解

    java中Lamda表達式講解

    本文詳細講解了java中的Lamda表達式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Mybatis多線程下如何使用Example詳解

    Mybatis多線程下如何使用Example詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis多線程下如何使用Example的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習或者使用Mybatis具有一定的參考學(xué)習價值,需要的朋友們下面來一起學(xué)習學(xué)習吧
    2019-12-12
  • struts2中simple主題下<s:fieldError>標簽?zāi)J樣式的移除方法

    struts2中simple主題下<s:fieldError>標簽?zāi)J樣式的移除方法

    這篇文章主要給大家介紹了關(guān)于struts2中simple主題下<s:fieldError>標簽?zāi)J樣式的移除方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習學(xué)習吧
    2018-10-10

最新評論

行唐县| 襄樊市| 武陟县| 什邡市| 惠来县| 密云县| 乌兰察布市| 宜兰市| 龙胜| 安陆市| 安陆市| 临沭县| 清徐县| 漳浦县| 乌兰察布市| 昭通市| 寿阳县| 余江县| 江城| 武陟县| 阳朔县| 饶平县| 临夏县| 丹巴县| 巴南区| 修水县| 离岛区| 体育| 甘谷县| 渑池县| 肥城市| 仲巴县| 巴马| 华亭县| 绥芬河市| 仁寿县| 那坡县| 阳春市| 张掖市| 安达市| 镇巴县|