亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的CountDownLatch同步工具類使用解析

 更新時間:2023年12月16日 09:53:14   作者:niulx111  
這篇文章主要介紹了Java中的CountDownLatch使用解析,CountDownLatch初始化的時候必須指定一個count,await方法會一直阻塞直到調(diào)用countdown方法,count為0,當count為0時,所有的等待線程都會被釋放,需要的朋友可以參考下

CountDownLatch同步工具類

CountDownLatch初始化的時候必須指定一個count,await方法會一直阻塞直到調(diào)用countdown方法,count為0,當count為0時,所有的等待線程都會被釋放。

count是不能被重置的,如果想重復使用count,可以考慮CyclicBarrier。

CountDownLatch是一個同步工具類,用來協(xié)調(diào)多個線程之間的同步,或者是線程之間的通信。

CountDownLatch可以使主線程等待子線程完成自己的任務之后在繼續(xù)執(zhí)行,count為線程的數(shù)量,每當線程完成一個任務后,count減一,當count為0時,表示所有的任務都已經(jīng)完成,這時主線程就可以繼續(xù)執(zhí)行。

CountDownLatch的構(gòu)造函數(shù)

    public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }

初始化的時候必須指定一個大于等于0的count,否則會拋出異常。

        Sync(int count) {
            setState(count);
        }

CountDownLatch的同步是使用了AQS的狀態(tài)代表count。

看一下它的countdown方法。

    /**
     * 如果count為0時,釋放所有的等待線程
     * 如果當前的count比0大就要遞減
     * 如果當前count為0什么也不做
     */
    public void countDown() {
        sync.releaseShared(1);
    }

本質(zhì)還是調(diào)用了AQS的releaseShared方法。

    public final boolean releaseShared(int arg) {
        if (tryReleaseShared(arg)) {
            doReleaseShared();
            return true;
        }
        return false;
    }
protected boolean tryReleaseShared(int releases) {
            // Decrement count; signal when transition to zero
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }

countdown就是釋放鎖的操作,每被調(diào)用一次,state就減一。首先嘗試釋放鎖,利用CAS設置state,如果state為0,說明所有的子線程都完成了操作,這是就要喚醒在同步隊列上的其他線程。

再來看一下await方法。

    public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }
    public final void acquireSharedInterruptibly(int arg)
            throws InterruptedException {
        if (Thread.interrupted())
            throw new InterruptedException();
        if (tryAcquireShared(arg) < 0)
            doAcquireSharedInterruptibly(arg);
    }
        protected int tryAcquireShared(int acquires) {
            return (getState() == 0) ? 1 : -1;
        }

嘗試獲取鎖,如果state為0,表示獲取鎖成功,如果state不為0,表示獲取鎖失敗,調(diào)用doAcquireSharedInterruptibly方法阻塞直到成功獲取到鎖。

CountDownLatch的使用

public static void main(String[] args) throws Exception {
		java.util.concurrent.CountDownLatch c = new java.util.concurrent.CountDownLatch(3);
		ExecutorService es = Executors.newCachedThreadPool();
		for (int i = 0; i < 3; i++) {
			es.execute(new Task(i, c));
		}
		c.await();
		System.out.println("主線程執(zhí)行任務");
	}
	public static class Task implements Runnable {
		private int m;
		private java.util.concurrent.CountDownLatch c;
		public Task(int m,java.util.concurrent.CountDownLatch c) {
			this.m = m;
			this.c = c;
		}
		@Override
		public void run() {
			System.out.println("子線程"+m+"完成了任務");
			c.countDown();
		}
	}

執(zhí)行結(jié)果

子線程1完成了任務
子線程0完成了任務
子線程2完成了任務
主線程執(zhí)行任務

在多線程中,子線程需要完成各自的任務后,主線程才能利用子線程的結(jié)果進行整合,我們可以考慮CountDownLatch來控制并發(fā)。

CountDownLatch只是一個同步輔助類,當CountDownLatch的計數(shù)器未到0之前,所有調(diào)用await的方法都會阻塞,只有計數(shù)器為0,線程才能繼續(xù)往下執(zhí)行。CountDownLatch的計數(shù)器是不可重用的。

到此這篇關(guān)于Java中的CountDownLatch同步工具類使用解析的文章就介紹到這了,更多相關(guān)CountDownLatch同步工具類解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文秒懂springboot druid 配置

    一文秒懂springboot druid 配置

    Druid是阿里巴巴開發(fā)的一個連接池,他提供了一個高效、功能強大、可擴展性好的數(shù)據(jù)庫連接池,區(qū)別于hikari,今天通過本文給大家分享springboot druid 配置教程,需要的朋友參考下吧
    2021-08-08
  • Java動態(tài)腳本Groovy

    Java動態(tài)腳本Groovy

    本文介紹了Java動態(tài)腳本Groovy,Groovy是用于Java虛擬機的一種敏捷的動態(tài)語言,它是一種成熟的面向?qū)ο缶幊陶Z言,既可以用于面向?qū)ο缶幊蹋挚梢杂米骷兇獾哪_本語言。使用該種語言不必編寫過多的代碼,同時又具有閉包和動態(tài)語言中的其他特性,需要的朋友可以參考一下
    2021-12-12
  • 詳解Java分布式系統(tǒng)中session一致性問題

    詳解Java分布式系統(tǒng)中session一致性問題

    這篇文章主要介紹了Java分布式系統(tǒng)中session一致性問題,對分布式系統(tǒng)感興趣的同學,要仔細看一下
    2021-04-04
  • Springboot實現(xiàn)導入導出Excel的方法

    Springboot實現(xiàn)導入導出Excel的方法

    今天帶各位小伙伴學習Springboot實現(xiàn)導入導出Excel的方法,文中有非常詳細的介紹,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • java編程abstract類和方法詳解

    java編程abstract類和方法詳解

    這篇文章主要介紹了java編程abstract類和方法詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 深入了解Spring中最常用的11個擴展點

    深入了解Spring中最常用的11個擴展點

    我們一說到spring,可能第一個想到的是?IOC(控制反轉(zhuǎn))?和?AOP(面向切面編程)。除此之外,我們在使用spring的過程中,有沒有發(fā)現(xiàn)它的擴展能力非常強。今天就來跟大家一起聊聊,在Spring中最常用的11個擴展點
    2022-09-09
  • Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算

    Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算

    這篇文章主要介紹了Java編寫程序之輸入一個數(shù)字實現(xiàn)該數(shù)字階乘的計算,本文通過實例代碼給大家介紹的非常想詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • SpringBoot項目實現(xiàn)日志打印SQL的常用方法(包括SQL語句和參數(shù))

    SpringBoot項目實現(xiàn)日志打印SQL的常用方法(包括SQL語句和參數(shù))

    有時候遇到問題需要根據(jù)我們編寫的SQL進行分析,但如果不進行一些開發(fā)或者配置的話,這些SQL是不會打印到控制臺的,它們默認是隱藏的。下面給大家介紹幾種常用的方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java中類加載過程全面解析

    Java中類加載過程全面解析

    這篇文章主要介紹了Java中類加載過程全面解析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java正則表達式對特殊字符的轉(zhuǎn)義以及異?,F(xiàn)象

    java正則表達式對特殊字符的轉(zhuǎn)義以及異常現(xiàn)象

    這篇文章主要給大家介紹了關(guān)于java正則表達式對特殊字符的轉(zhuǎn)義以及異?,F(xiàn)象的相關(guān)資料,在Java中使用正則表達式匹配特殊字符也需要使用轉(zhuǎn)義字符"\",需要的朋友可以參考下
    2023-06-06

最新評論