欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)文章

最新評論