91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java多線程協作作業之信號同步怎么實現

發布時間:2022-05-11 09:12:06 來源:億速云 閱讀:139 作者:iii 欄目:開發技術

本篇內容介紹了“Java多線程協作作業之信號同步怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、信號同步

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

    減少計數)、CyclicBarrier(循環柵欄)、Semaphore(信號燈)。

    二、基于時間維度

    1、CountDownLatch

    多少個協作線程就初始化CountDownLatch的構造參數是多少。

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

    Java多線程協作作業之信號同步怎么實現

    2、CyclicBarrier

    與減少計數類似

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

    Java多線程協作作業之信號同步怎么實現

    三、基于信號維度

    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獲得信號。

    Java多線程協作作業之信號同步怎么實現

    “Java多線程協作作業之信號同步怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    白银市| 永安市| 金门县| 江达县| 城口县| 旬阳县| 土默特右旗| 洛浦县| 平湖市| 仲巴县| 类乌齐县| 海淀区| 平遥县| 柳河县| 分宜县| 绥江县| 宜兰市| 台南县| 普兰县| 平顶山市| 新田县| 从江县| 闽侯县| 霍林郭勒市| 东城区| 犍为县| 穆棱市| 深水埗区| 永顺县| 大庆市| 涟源市| 东乌珠穆沁旗| 峨边| 双牌县| 岗巴县| 阜宁县| 双柏县| 香港| 芜湖市| 西林县| 雷波县|