最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1、介紹

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

每次調用CountDown(),計數減1,執(zhí)行到await()函數會阻塞等待線程的執(zhí)行,直到計數為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 {
                   // 當前線程結束
                   end.countDown();
              }
          };
           exec.submit(run);
      }
       System.out.println("Game Start ...");
       begin.countDown();
       // 等待其他的線程結束
       end.await();
       System.out.println("Game Over.");
       exec.shutdown();
  }
}

圖片

3、如何利用AQS 實現 CountDownLatch

圖片

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

通過代碼可見,CountDownLatch 的核心實現是內部類 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 的代碼實現 很簡單,

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

圖片

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

4、總結

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

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

相關文章

  • Java實現小型圖書館管理系統(tǒng)

    Java實現小型圖書館管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現小型圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Bean?Searcher配合SpringBoot的使用詳解

    Bean?Searcher配合SpringBoot的使用詳解

    這篇文章主要介紹了Bean?Searcher配合SpringBoot的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • IDEA SpringBoot 項目配置Swagger2的詳細教程

    IDEA SpringBoot 項目配置Swagger2的詳細教程

    這篇文章主要介紹了IDEA SpringBoot 項目配置Swagger2的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Groovy動態(tài)語言使用教程簡介

    Groovy動態(tài)語言使用教程簡介

    這篇文章主要為大家介紹了Groovy動態(tài)語言使用教程簡介,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • JavaWeb實現mysql數據庫數據的添加和刪除

    JavaWeb實現mysql數據庫數據的添加和刪除

    這篇文章主要介紹了如何利用JavaWeb實現mysql數據庫數據的添加和刪除功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-03-03
  • 深入淺析JSON在java中的使用

    深入淺析JSON在java中的使用

    這篇文章主要介紹了JSON在java中的使用,包括javaBean和json的互轉,List 和 json 的互轉及map 和 json 的互轉,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-04-04
  • 23種設計模式(16)java訪問者模式

    23種設計模式(16)java訪問者模式

    這篇文章主要為大家詳細介紹了23種設計模式之java訪問者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • springboot配置內存數據庫H2教程詳解

    springboot配置內存數據庫H2教程詳解

    這篇文章主要介紹了springboot配置內存數據庫H2的詳細教程,需要的朋友可以參考下
    2017-07-07
  • 幾句話說清session,cookie和token的區(qū)別及說明

    幾句話說清session,cookie和token的區(qū)別及說明

    這篇文章主要介紹了幾句話說清session,cookie和token的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java中的StringTokenizer實現字符串切割詳解

    Java中的StringTokenizer實現字符串切割詳解

    這篇文章主要介紹了Java中的StringTokenizer實現字符串切割詳解,java.util工具包提供了字符串切割的工具類StringTokenizer,Spring等常見框架的字符串工具類(如Spring的StringUtils),需要的朋友可以參考下
    2024-01-01

最新評論

绵阳市| 寿宁县| 阳新县| 正定县| 宕昌县| 邵阳县| 新营市| 什邡市| 临洮县| 枣庄市| 镇安县| 建瓯市| 饶平县| 百色市| 芒康县| 双江| 黄浦区| 凭祥市| 伊川县| 鲁山县| 沐川县| 仁寿县| 鹤壁市| 庐江县| 江西省| 鄂伦春自治旗| 郎溪县| 晋江市| 深泽县| 吴旗县| 红原县| 衡南县| 商南县| 大足县| 涿鹿县| 遂宁市| 衡水市| 通山县| 忻城县| 隆德县| 大港区|