首頁  >  文章  >  Java  >  實作Java多執行緒協作作業中的訊號同步,可以採用以下方法:

實作Java多執行緒協作作業中的訊號同步,可以採用以下方法:

WBOY
WBOY轉載
2023-05-09 10:07:081320瀏覽

    一、訊號同步

    多執行緒很多時候是協作作業。例如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多執行緒協作作業中的訊號同步,可以採用以下方法:的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除