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

Java詳解多線程協(xié)作作業(yè)之信號同步

 更新時間:2022年05月10日 17:06:25   作者:好奇的菜鳥  
信號量同步是指在不同線程之間,通過傳遞同步信號量來協(xié)調(diào)線程執(zhí)行的先后次序。CountDownLatch是基于時間維度的Semaphore則是基于信號維度的

一、信號同步

多線程很多時候是協(xié)作作業(yè)。比如4個線程對電商數(shù)據(jù)分季度統(tǒng)計,統(tǒng)計完成之后,再匯總。如何知道4個線程都執(zhí)行完成呢,我們可以使用JDK1.5給我們提供的輔助類CountDownLatch(

減少計數(shù))、CyclicBarrier(循環(huán)柵欄)、Semaphore(信號燈)。

二、基于時間維度

1、CountDownLatch

多少個協(xié)作線程就初始化CountDownLatch的構(gòu)造參數(shù)是多少。

 public static void main(String[] args) throws InterruptedException {
        final int NUM=6;
        //定義總數(shù)量;
        CountDownLatch countDownLatch=new CountDownLatch(NUM);
        for (int i = 0; i < NUM; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"線程,已執(zhí)行!");
                //減少計數(shù)
                countDownLatch.countDown();
            },String.valueOf(i+1)).start();
        }
        //等待所有任務(wù)完成
        countDownLatch.await();
        System.out.println("所有線程任務(wù)已經(jīng)執(zhí)行完成!");
    }

2、CyclicBarrier

與減少計數(shù)類似

 public static void main(String[] args) {
        final int NUM = 6;
        //定義循環(huán)數(shù)量及循環(huán)完成后的任務(wù)(Runnable接口實現(xiàn));
        CyclicBarrier cyclicBarrier = new CyclicBarrier(NUM, () -> {
            System.out.println("所有線程任務(wù)已經(jīng)執(zhí)行完成!");
        });
        for (int i = 0; i < NUM; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"線程,已執(zhí)行!");
                try {
                    //等待點或障礙點,等待所有任務(wù)完成,
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i+1)).start();
        }
    }

三、基于信號維度

Semaphore,線程與信號是m:n,其中m>=n。

import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/*信號燈
* 6個線程,搶占三個信號
* */
public class SemaphoreDemo {
    public static void main(String[] args) {
        Semaphore semaphore=new Semaphore(3);
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    //獲取信號
                    semaphore.acquire();
                    System.out.println("線程:"+Thread.currentThread().getName()+"----獲取信號");
                    int time = new Random().nextInt(5);
                    System.out.println(("線程:"+Thread.currentThread().getName()+"----休眠"+time+"s!"));
                    TimeUnit.SECONDS.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                //    釋放信號
                    System.out.println("線程:"+Thread.currentThread().getName()+"---釋放信號");
                    semaphore.release();
                }
            },String.valueOf(i+1)).start();
        }
    }
}

首先線程4、1、3獲取到信號,線程1釋放信號后,線程2獲得信號。線程2、3釋放信號后,線程5、6獲得信號。

到此這篇關(guān)于Java詳解多線程協(xié)作作業(yè)之信號同步的文章就介紹到這了,更多相關(guān)Java信號同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • iOS socket網(wǎng)絡(luò)編程實例詳解

    iOS socket網(wǎng)絡(luò)編程實例詳解

    socket是一個針對TCP和UDP編程的接口,你可以借助它建立TCP連接等。這篇文章主要介紹了iOS socket網(wǎng)絡(luò)編程 ,需要的朋友可以參考下
    2017-03-03
  • Java實現(xiàn)的質(zhì)因數(shù)分解操作示例【基于遞歸算法】

    Java實現(xiàn)的質(zhì)因數(shù)分解操作示例【基于遞歸算法】

    這篇文章主要介紹了Java實現(xiàn)的質(zhì)因數(shù)分解操作,結(jié)合實例形式較為詳細的分析了Java基于遞歸算法實現(xiàn)針對整數(shù)的質(zhì)因數(shù)分解相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • java驗證碼組件kaptcha使用方法

    java驗證碼組件kaptcha使用方法

    這篇文章主要介紹了java驗證碼組件kaptcha使用方法,很不錯的一個組件,可以在JAVA開發(fā)中使用,大家都試試吧
    2013-11-11
  • java版微信和支付寶退款接口

    java版微信和支付寶退款接口

    這篇文章主要為大家詳細介紹了java版微信退款接口和java版支付寶退款接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Java 自定義Spring框架與核心功能詳解

    Java 自定義Spring框架與核心功能詳解

    Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)
    2021-10-10
  • springboot組件初始化后的4種啟動方式及常用方法

    springboot組件初始化后的4種啟動方式及常用方法

    在Spring Boot中,您可以通過幾種方式在組件初始化后執(zhí)行啟動任務(wù),下面小編給大家分享springboot組件初始化后的4種啟動方式及常用方法,感興趣的朋友一起看看吧
    2024-06-06
  • Java終止線程的兩種方法

    Java終止線程的兩種方法

    本文主要介紹了Java終止線程的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • RocketMQ?NameServer架構(gòu)設(shè)計啟動流程

    RocketMQ?NameServer架構(gòu)設(shè)計啟動流程

    這篇文章主要為大家介紹了RocketMQ?NameServer架構(gòu)設(shè)計啟動流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • springboot + mybatis + druid + 多數(shù)據(jù)源的問題詳解

    springboot + mybatis + druid + 多數(shù)據(jù)源的問題詳解

    這篇文章主要介紹了springboot + mybatis + druid + 多數(shù)據(jù)源的問題詳解,示例代碼文字相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • java使用poi生成excel的步驟

    java使用poi生成excel的步驟

    2010以上格式使用XSSFWorkBook對象, 2003格式使用HSSFWorkBook對象, 其他對象操作基本一樣,本文重點給大家介紹java使用poi生成excel的相關(guān)知識,感興趣的朋友一起看看吧
    2022-04-04

最新評論

奉新县| 白河县| 同德县| 虞城县| 平远县| 错那县| 宁强县| 左贡县| 鱼台县| 兖州市| 泰和县| 大邑县| 柘城县| 武汉市| 红原县| 西青区| 吉木萨尔县| 岳西县| 朔州市| 全南县| 丹东市| 荆门市| 乐亭县| 临猗县| 万安县| 贡山| 遂溪县| 上犹县| 高尔夫| 巴中市| 渭南市| 射洪县| 汤阴县| 大埔区| 清河县| 安达市| 兴义市| 马边| 宜川县| 高要市| 上虞市|