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

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

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

1、介紹

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

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

CountDownLantch 無法重置

2、countdownlantch的用法。

舉個(gè)例子

場景:模擬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);
       // 啟動是個(gè)線程
       for (int i = 0; i < RUNNER_COUNT; i++) {
           final int NO = i + 1;
           Runnable run = () -> {
               try {
                   // 主線程 begin 之后所有的線程才會開始運(yùn)行
                   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 實(shí)現(xiàn) CountDownLatch

圖片

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

通過代碼可見,CountDownLatch 的核心實(shí)現(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;
          }
      }
  }

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

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

圖片

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

4、總結(jié)

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

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

相關(guān)文章

  • Java實(shí)現(xiàn)小型圖書館管理系統(tǒng)

    Java實(shí)現(xiàn)小型圖書館管理系統(tǒng)

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

    Bean?Searcher配合SpringBoot的使用詳解

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

    IDEA SpringBoot 項(xiàng)目配置Swagger2的詳細(xì)教程

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

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

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

    JavaWeb實(shí)現(xiàn)mysql數(shù)據(jù)庫數(shù)據(jù)的添加和刪除

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

    深入淺析JSON在java中的使用

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

    23種設(shè)計(jì)模式(16)java訪問者模式

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

    springboot配置內(nèi)存數(shù)據(jù)庫H2教程詳解

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

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

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

    Java中的StringTokenizer實(shí)現(xiàn)字符串切割詳解

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

最新評論

山丹县| 三河市| 安溪县| 二连浩特市| 桑植县| 宁南县| 高密市| 海晏县| 阳谷县| 济阳县| 鄂尔多斯市| 象州县| 长治县| 盐津县| 开化县| 新晃| 吉木萨尔县| 巴彦淖尔市| 苍溪县| 凌海市| 龙州县| 赤水市| 南通市| 邹平县| 台山市| 连州市| 香港| 广河县| 凤台县| 辉县市| 扬州市| 余姚市| 尼勒克县| 化州市| 昌乐县| 高阳县| 珲春市| 建平县| 泰州市| 南乐县| 呼图壁县|