成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這么好的工具,你應該要熟悉

開發 開發工具
涉及到線程的開發都伴隨著復雜性,不管是在代碼調試上還是理解線程切換與安全性上,JUC提供的各種強大的工具類將并發編程的復雜性進行了封裝,不管是在使用或是擴展上,都能通過簡單的幾行代碼實現多線程的各種協調工作。

并發編程一直是開發中的難點,但又是當代程序員不得不熟悉的技術,其中涉及到線程中協調問題,如何保證線程能夠按照我們預期的方式執行呢?今天和大家一起了解下jdk中為我們提供的那些有用的工具類

JUC - 輔助類

JUC(java.util.concurrent)是在Java 5中引入的一個并發編程的擴展庫,目的是為了更加方便、快捷和安全地實現并發編程。它提供了一系列的工具類、鎖、隊列以及原子類等來協調多線程之間的操作。

基于現代硬件不斷地發展,為了充分利用服務器資源,并發編程在我們的開發中已經無處不在,今天主要了解下JUC包中提供的幾個工具類,讓我們在并發編程時提供助力。

簡介

Java并發編程是一門復雜的技術,其中有一些難點需要特別注意。比如以下是一些Java并發編程過程中會遇到的問題以及難點:

  • 線程安全:多線程執行的代碼必須是線程安全的,否則會產生競態條件和其他問題。
  • 死鎖:當多個線程因為互相等待其他線程釋放鎖而無法繼續執行時,就會產生死鎖。
  • 競態條件:當多個線程試圖同時訪問同一個共享資源時,就會產生競態條件。
  • 內存可見性:多個線程同時訪問同一個變量時,可能會產生內存可見性問題,即一個線程對變量的修改不會立即被其他線程所感知。
  • 并發集合類:Java提供了一些并發集合類,如ConcurrentHashMap和ConcurrentLinkedQueue,但使用它們需要注意一些細節問題。
  • 線程池:線程池是Java并發編程中的一個重要概念,但線程池的使用也需要注意一些問題,如線程池大小、任務隊列類型等。
  • CAS操作:Java提供了CAS(Compare-And-Swap)操作,可以用于實現非阻塞算法,但使用CAS操作需要非常小心,以免產生ABA問題等。

在并發編程中,如何協調各個線程的執行也是一件比較麻煩的事,還好JUC包中為我們提供了幾個常用的工具類來解決線程執行的控制以及協調多個線程執行過程,下面我們具體看一看...

工具類

  • CountDownLatch
    CountDownLatch是一個同步輔助類,使用一個給定數量的計數器,當該計數器不為0時,將程序阻塞在wait()處,當線程執行完成后通過調用countDown()使計數器減一, 直到計數器為0后才會繼續執行后續代碼。主要實現某個任務依賴其他一個或多個異步任務的執行結果的場景

核心方法:

/**
 * 定義計數器數量,用于定義多少個執行線程
 */
public CountDownLatch(int count);
/**
 * 阻塞方法,直到計數器為0時才會繼續執行后續代碼
 */
public void await();
/**
 * 每次調用該方法,則計數器減一
 */
public void countDown();
  • CyclicBarrier
    CyclicBarrier內部同樣定義了計數器,只不過每當有線程執行完后改計數器加一,直至達到定義數量后,執行定義的回調函數與await()后續代碼。與CountDownLatch相比,CyclicBarrier會對子任務阻塞,而CountDownLatch則阻塞主任務;另外CyclicBarrier可以重復使用。主要實現某個回調函數在一個或多個線程執行完成后觸發的情形

核心方法:

/**
 * 定義計數器數量與回調函數
 */
public CyclicBarrier(int parties, Runnable barrierAction);
/**
 * 阻塞方法,當有線程執行到則計數器加一,等到達到目標數后才會繼續后續代碼
 */
public int await();
/**
 * 通過該方法可以實現計數器的重置
 */
public void reset();
  • Semaphore
    信號量通常用于限制可以訪問某些(物理或邏輯)資源的線程數。適用于有限資源數量的控制

核心方法:

/**
 * 定義許可數量
 */
public Semaphore(int permits);
/**
 * 申請許可,改方法會阻塞程序
 */
public void acquire();
/**
 * 釋放許可
 */
public void release();

示例

CountDownLatch的使用場景

CountDownLatch是Java并發包中的一個工具類,它可以實現線程之間的協作。具體來說,CountDownLatch可以讓一個線程等待多個線程執行完畢,再繼續執行。CountDownLatch常用于以下場景:

  1. 主線程等待多個子線程執行完畢。
  2. 多個子線程等待某個共同任務的完成。
  3. 模擬并發請求,等待所有請求都響應完畢再進行下一步操作。
  4. 統計多個線程執行的時間。
@Test
    public void test() throws InterruptedException {
        int count = 10;
        CountDownLatch countDownLatch = new CountDownLatch(count);
        IntStream.range(0,count).forEach(i->{
            new Thread(()->{
                System.out.println( "執行線程:"+ i );
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                countDownLatch.countDown();
            }).start();
        });

        countDownLatch.await();

        System.out.println("線程執行完成");
    }

CyclicBarrier的使用場景

它允許多個線程在某個屏障處等待,直到所有線程都到達該屏障時才會繼續執行。

CyclicBarrier 適用于一組線程需要相互等待,直到所有線程都完成某個任務后才能繼續執行下一步操作的場景。例如,一個大型的計算任務可以被分成多個子任務, 每個子任務由一個線程執行。當所有子任務完成后,這些線程需要等待,直到所有子任務都完成,然后再執行下一步操作。

另外,CyclicBarrier 還可以用于優化代碼性能。例如,當我們需要等待多個線程都完成某項工作后,才能進行下一步操作。此時,我們可以使用 CyclicBarrier 來實現等待, 而不是使用 Thread.sleep() 方法等待一段時間。這樣可以避免無謂地等待時間,提高代碼效率。

@Test
    public void test() {
        int count = 10;
        AtomicBoolean finish = new AtomicBoolean(false);
        CyclicBarrier cyclicBarrier = new CyclicBarrier(count, ()->{
            System.out.println("線程執行完成");
            finish.set(true);
        });

        IntStream.range(0,count).forEach(i->{
            new Thread(()->{
                System.out.println( "執行線程:"+ i );
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }
            }).start();
        });

        while (!finish.get()){}
    }

Semaphore的使用場景

它可以控制同時訪問某個共享資源的線程數量。常用于限制同時訪問某個資源的線程數量,例如數據庫連接池、線程池等。

  1. 控制并發線程數:Semaphore可以限制并發線程數,從而控制系統資源的使用情況。
  2. 控制訪問資源數:Semaphore可以控制同時訪問某個資源的線程數量,例如數據庫連接池,限制連接數。
  3. 實現生產者-消費者模型:Semaphore可以與阻塞隊列一起使用,實現生產者-消費者模型,控制生產者和消費者的數量。
  4. 多個線程間的協作:Semaphore可以用于多個線程之間的協作,例如某個線程需要等待某些條件滿足后才能繼續執行,可以使用Semaphore來實現等待和喚醒操作。
@Test
    public void test() {
        int count = 10;

        Semaphore semaphore = new Semaphore(3);

        IntStream.range(0,count).forEach(i->{
            new Thread(()->{
                try {
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                System.out.println( "執行線程:"+ i );

                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                semaphore.release();
            }).start();
        });

        while (true){}
    }

結束語

涉及到線程的開發都伴隨著復雜性,不管是在代碼調試上還是理解線程切換與安全性上,JUC提供的各種強大的工具類將并發編程的復雜性進行了封裝,不管是在使用或是擴展上,都能通過簡單的幾行代碼實現多線程的各種協調工作。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2024-07-22 13:58:33

2021-06-28 11:45:28

Kafka消費者參數

2011-10-11 10:07:37

2016-05-17 10:37:46

2015-07-13 14:40:55

微軟Windows 10

2017-06-06 11:59:26

Docker工具容器

2013-01-23 09:31:30

2013-05-20 10:14:42

軟件工具項目工具開發工具

2020-12-09 18:22:00

微前端微服務前端

2018-07-13 08:31:58

開源AI工具

2022-05-09 14:46:55

勒索軟件數據保護

2010-09-13 15:40:00

2017-08-28 16:33:46

UI界面模式用戶

2010-12-13 14:37:36

.NET開發

2011-07-10 15:18:11

開發

2020-03-30 21:46:26

SQL數據分析數據

2019-06-28 08:56:35

編程語言框架工具

2018-10-17 09:00:00

JavaScript工具前端

2024-02-26 07:51:08

業務系統迭代
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久一区二区三区 | 亚洲国产中文字幕 | 一区二区三区亚洲视频 | 久久精品二区 | 日韩一区二区免费视频 | 久久99国产精品 | 91在线一区二区三区 | 91麻豆精品国产91久久久更新资源速度超快 | 日本一区二区三区免费观看 | 国产精品久久二区 | 色爱区综合| www.99久久.com | 国产乱码精品一区二区三区忘忧草 | 最新日韩精品 | 欧美综合一区二区三区 | 国产成人福利视频 | av在线天天 | 亚洲一区二区三区免费在线观看 | 中文字幕免费视频 | 亚洲一区二区三区在线免费 | 国产一区二区在线视频 | 成人一区二区三区在线 | 天堂一区| 精品日本久久久久久久久久 | 欧美成人a∨高清免费观看 91伊人 | 国产一区不卡 | 成人亚洲精品久久久久软件 | 精品久久国产 | 成人免费一级 | 欧美国产91 | 国产精品毛片一区二区三区 | 午夜精品视频一区 | 国产精品久久久久久久久久久久午夜片 | 伦理午夜电影免费观看 | 日韩免费av | 国产丝袜一区二区三区免费视频 | 美女操网站 | 国产真实乱对白精彩久久小说 | 9久9久9久女女女九九九一九 | 99精品电影 | 中文字幕日韩专区 |