亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

    厦门市| 晴隆县| 侯马市| 陇西县| 苍梧县| 镇远县| 天峻县| 瓦房店市| 平陆县| 达尔| 雅江县| 长宁区| 昔阳县| 渝北区| 滁州市| 巍山| 深圳市| 内黄县| 建德市| 扬州市| 永仁县| 新民市| 万安县| 德保县| 鲁甸县| 五峰| 苗栗县| 芮城县| 温宿县| 甘德县| 木里| 泾阳县| 石门县| 南京市| 鄂尔多斯市| 固原市| 綦江县| 承德市| 阿克苏市| 松滋市| 刚察县|