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

帶你快速搞定java多線程(5)

 更新時間:2021年07月14日 17:28:17   作者:香菜聊游戲  
這篇文章主要介紹了java多線程編程實例,分享了幾則多線程的實例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下

1、介紹

CountDownLantch 倒數(shù)計時器,一個同步輔助類,一個線程(或者多個),等待另外N個線程完成某個事情后才能執(zhí)行。用給定的計數(shù)初始化CountDownLatch,其含義是要被等待執(zhí)行完的線程個數(shù)。

每次調(diào)用CountDown(),計數(shù)減1,執(zhí)行到await()函數(shù)會阻塞等待線程的執(zhí)行,直到計數(shù)為0。

CountDownLantch 無法重置

2、countdownlantch的用法。

舉個例子

場景:模擬10人賽跑。喊完“Game Start”才開始跑,10人跑完后才喊"Game Over.",代碼如下:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* CountDownLatchTest
* @author 香菜
*/
public class CountDownLatchTest {
   private static final int RUNNER_COUNT = 10;
   private static final int CORE_THREAD_COUNT = 10;
   public static void main(String[] args) throws InterruptedException {
       final CountDownLatch begin = new CountDownLatch(1);
       final CountDownLatch end = new CountDownLatch(RUNNER_COUNT);
       final ExecutorService exec = Executors.newFixedThreadPool(CORE_THREAD_COUNT);
       // 啟動是個線程
       for (int i = 0; i < RUNNER_COUNT; i++) {
           final int NO = i + 1;
           Runnable run = () -> {
               try {
                   // 主線程 begin 之后所有的線程才會開始運行
                   begin.await();
                   Thread.sleep((long)(Math.random() * 10000));
                   System.out.println("No." + NO + " arrived");
              } catch (InterruptedException e) {
                   e.printStackTrace();
              } finally {
                   // 當(dāng)前線程結(jié)束
                   end.countDown();
              }
          };
           exec.submit(run);
      }
       System.out.println("Game Start ...");
       begin.countDown();
       // 等待其他的線程結(jié)束
       end.await();
       System.out.println("Game Over.");
       exec.shutdown();
  }
}

圖片

3、如何利用AQS 實現(xiàn) CountDownLatch

圖片

  • void await():如果當(dāng)前count大于0,當(dāng)前線程將會wait,直到count等于0或者中斷。
  • boolean await(long timeout, TimeUnit unit):使當(dāng)前線程在鎖存器倒計數(shù)至零之前一直等待,除非線程被中斷或超出了指定的等待時間。
  • void countDown():遞減鎖存器的計數(shù),如果計數(shù)到達(dá)零,則釋放所有等待的線程。 long getCount() :獲得計數(shù)的數(shù)量

通過代碼可見,CountDownLatch 的核心實現(xiàn)是內(nèi)部類 Sync,Sync 繼承自 AbstractQueuedSynchronizer,讓我們打開Sync 一探究竟。

private static final class Sync extends AbstractQueuedSynchronizer {
      private static final long serialVersionUID = 4982264981922014374L;
      Sync(int count) {
          setState(count);
      }
      int getCount() {
          return getState();
      }
      protected int tryAcquireShared(int acquires) {
          return (getState() == 0) ? 1 : -1;
      }
      protected boolean tryReleaseShared(int releases) {
          // Decrement count; signal when transition to zero
          for (;;) {
              int c = getState();
              if (c == 0)
                  return false;
              int nextc = c-1;
              if (compareAndSetState(c, nextc))
                  return nextc == 0;
          }
      }
  }

整個Sync 的代碼實現(xiàn) 很簡單,

  • 線程計數(shù) 是通過 state 控制 ,上篇文章我們分析過,state的同步使用 CAS 實現(xiàn)的樂觀鎖。
  • 獲得鎖計數(shù) 通過 tryAcquireShared ,代碼很直接了,如果state == 0 返回1,將當(dāng)前線程加入到隊列中
  • 釋放鎖 通過 tryReleaseShared 將 state -1 ,釋放一個鎖。

圖片

AQS的實現(xiàn)可以看下上篇文章?!抖嗑€程系列五》沒人給你說的AQS,打通多線程編程

4、總結(jié)

通過分析 countdownlantch 單獨的代碼可以看到通過AQS 實現(xiàn)的線程同步是多么簡單,所以理解了AQS 就可以實現(xiàn)自己的同步器。

本篇文章就到這里了,希望能對你有所幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解DES加密算法的原理與Java實現(xiàn)

    詳解DES加密算法的原理與Java實現(xiàn)

    DES 加密,是對稱加密。對稱加密,顧名思義,加密和解密的運算全都是使用的同樣的秘鑰。這篇文章主要為大家講講DES加密算法的原理與Java實現(xiàn),需要的可以參考一下
    2022-10-10
  • 實例解析Json反序列化之ObjectMapper(自定義實現(xiàn)反序列化方法)

    實例解析Json反序列化之ObjectMapper(自定義實現(xiàn)反序列化方法)

    這篇文章主要介紹了實例解析Json反序列化之ObjectMapper,json自定義序列化的方法,需要的朋友可以了解下。
    2017-09-09
  • Java排序算法之歸并排序簡單實現(xiàn)

    Java排序算法之歸并排序簡單實現(xiàn)

    這篇文章主要介紹了Java排序算法之歸并排序簡單實現(xiàn),具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • SpringBoot請求參數(shù)接收方式

    SpringBoot請求參數(shù)接收方式

    這篇文章主要介紹了SpringBoot請求參數(shù)接收方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot整合ES-Elasticsearch的實例

    SpringBoot整合ES-Elasticsearch的實例

    這篇文章主要介紹了SpringBoot整合ES-Elasticsearch的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java21虛擬線程實踐

    Java21虛擬線程實踐

    java21正式版發(fā)布了,為我們帶來了很多新的特性,其中我最感興趣的就是虛擬線程,本文主要介紹了Java21虛擬線程實踐,感興趣的可以;了解一下
    2023-10-10
  • Log4j日志分類和過濾敏感字段的實例

    Log4j日志分類和過濾敏感字段的實例

    這篇文章主要介紹了Log4j日志分類和過濾敏感字段的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • java后端PayPal支付實現(xiàn)教程

    java后端PayPal支付實現(xiàn)教程

    本文主要介紹了java后端PayPal支付實現(xiàn)教程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Mybatis源碼解析之初始化分析

    Mybatis源碼解析之初始化分析

    這篇文章主要介紹了Mybatis源碼解析之初始化分析,Mybatis的初始化過程就是mybatis配置文件的解析過程并將解析結(jié)果保存到Configuration類。,需要的朋友可以參考下
    2024-01-01
  • java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02

最新評論