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

Java并發(fā)工具輔助類代碼實(shí)例

 更新時(shí)間:2020年04月16日 10:04:40   作者:CloverLucky  
這篇文章主要介紹了Java并發(fā)工具輔助類代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

java中的并發(fā)工具類

一:等待多線程完成的CountDownLatch

CountDownLatch允許一個(gè)或多個(gè)線程等待其他線程完成操作。

package com.fuzhulei;
import java.util.concurrent.*;
​
/**
 * 減法計(jì)數(shù)器,主要是countDown(計(jì)數(shù)器1) 和 await(阻塞)方法,只有當(dāng)計(jì)數(shù)器減為0的時(shí)候,當(dāng)前線程才可以往下繼續(xù)執(zhí)行。
 * 主要用于允許一個(gè)或多個(gè)線程等待其他線程完成操作
 * @author Huxudong
 * @createTime 2020-04-05 00:04:36
 **/
public class CountDownDemo {
  public static void main(String[] args) throws InterruptedException {
    /** 使用其構(gòu)造函數(shù),創(chuàng)建一個(gè)數(shù)值為6的計(jì)數(shù)器 */
    CountDownLatch countDownLatch = new CountDownLatch(6);
    /** 自定義線程池使用 */
    ExecutorService pool = new ThreadPoolExecutor(
        6,  // 核心線程池大小
        9, // 最大線程池的大?。ǜ鶕?jù)是IO密集型,還是CPU密集型來確定大?。?
        3L,  // 超時(shí)等待時(shí)間
        TimeUnit.SECONDS,  // 時(shí)間的單位
        new LinkedBlockingQueue<>(5), // 阻塞隊(duì)列是哪一種
        Executors.defaultThreadFactory(),   // 默認(rèn)線程創(chuàng)建工廠
        new ThreadPoolExecutor.AbortPolicy()  // 四大拒絕策略,選擇一種
    );
    try{
      for (int i = 0; i < 6; i++) {
        /** 這個(gè)線程的提交,沒有返回值的任務(wù) */
        pool.execute(()->{
          countDownLatch.countDown();
          System.out.println(Thread.currentThread().getName()+"執(zhí)行一次減法");
        });
​
      }
    } catch(Exception e) {
      e.printStackTrace();
    } finally {
      /** 關(guān)閉線程池 */
      pool.shutdown();
    }
​
    countDownLatch.await();
    System.out.println("執(zhí)行完成了");
​
  }
}

正確執(zhí)行結(jié)果:

但是如果我們設(shè)置計(jì)數(shù)器的容量大于6的話(相對于我的程序而言),就會(huì)被阻塞在那里

會(huì)發(fā)現(xiàn)執(zhí)行完成了 沒有被打印出來,而且程序一直沒有停止,這個(gè)時(shí)候就是因?yàn)橛?jì)數(shù)器沒有歸0,所以當(dāng)前線程被阻塞,不能向下面繼續(xù)進(jìn)行。

二:同步屏障CyclicBarrier

CyclicBarrier的翻譯大致就是可循環(huán)的屏障。它主要的作用就是讓一組線程到達(dá)一個(gè)屏障(也可以叫做同步點(diǎn))時(shí)被阻塞,直到最后一份線程到達(dá)屏障時(shí),屏障才會(huì)開門,所有被屏障攔截的線程才會(huì)繼續(xù)運(yùn)行。

package com.fuzhulei;
​
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
​
/**
 * CyclicBarrier是一個(gè)加法計(jì)數(shù)器,即同步屏障,可循環(huán)的屏障,讓一組線程到達(dá)一個(gè)屏障(也可以叫做同步點(diǎn))時(shí)被阻塞,直到最后一個(gè)線程到達(dá)屏障,達(dá)到了一開始初始化的屏障的數(shù)值,
 * 屏障才可以打開門,所有被攔截的線程才可以繼續(xù)工作,主要是通過調(diào)用await方法來實(shí)現(xiàn)的
 * @author Huxudong
 * @createTime 2020-04-04 22:53:50
 **/
public class CyclicBarrierDemo {
  public static void main(String[] args) {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
    new Thread(()->{
​
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程A已經(jīng)到達(dá)屏障");
    },"A").start();
​
    new Thread(()->{
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程B已經(jīng)到達(dá)屏障");
    },"B").start();
​
    new Thread(()->{
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程C已經(jīng)到達(dá)屏障");
    },"C").start();
​
​
  }
}

執(zhí)行的結(jié)果如下:

但是如果把定義的容量大于3(相對于我的程序而言),就會(huì)發(fā)現(xiàn)什么都不會(huì)輸出了,看截圖

并且程序一直還沒有停止,這就是屏障起到了作用,因?yàn)槠琳弦笾辽傩枰?個(gè)(假設(shè)),但是此時(shí)只有三個(gè)線程到達(dá),所以不滿足,屏障就一直阻攔不放路,那么所有的線程也就被阻塞不能向下面繼續(xù)運(yùn)行,除非知道第四個(gè)過來,滿足條件才會(huì)運(yùn)行。

三:控制并發(fā)線程數(shù)的Semaphore

用來控制同時(shí)訪問特定資源的線程數(shù)量,通過協(xié)調(diào)各個(gè)線程,以保證合理的使用公用的資源。

package com.fuzhulei;
​
import java.util.concurrent.*;
​
/**
 * 用來控制同時(shí)訪問特定資源的線程數(shù)量,通過協(xié)調(diào)各個(gè)線程,以保證合理的使用公用的資源
 * @author Huxudong
 * @createTime 2020-04-04 23:45:29
 **/
public class SemaphoreDemo {
  public static void main(String[] args) {
    Semaphore semaphore = new Semaphore(5);
    ExecutorService pool = new ThreadPoolExecutor(
        10,
        20,
        3L,
        TimeUnit.SECONDS,
        new LinkedBlockingQueue<>(20),
        Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.AbortPolicy());
​
    try{
      for (int i = 0; i < 60; i++) {
        pool.execute(() ->{
          try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+"限流成功");
            semaphore.release();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        });
      }
    } catch(Exception e) {
      e.printStackTrace();
    } finally {
      pool.shutdown();
    }
  }
}

執(zhí)行的結(jié)果如下:

例如:數(shù)據(jù)庫資源,假如需要讀取幾十萬個(gè)數(shù)據(jù)的文件,因?yàn)槎际荌O密集型任務(wù),所以開了2倍的處理器+1個(gè)線程數(shù)(IO密集型,所以線程可以多一些,讓cpu忙起來,因?yàn)镮O操作的時(shí)候,很少操作Cpu)

但是如果讀到內(nèi)存后,還需要存儲(chǔ)到數(shù)據(jù)庫中,但是數(shù)據(jù)庫連接我們設(shè)置的加入就10個(gè),所以我們必須控制只有10個(gè)線程可以同時(shí)訪問數(shù)據(jù)庫連接保存數(shù)據(jù),否則會(huì)報(bào)錯(cuò)無法連接數(shù)據(jù)庫異常。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot集成redis lettuce

    springboot集成redis lettuce

    目前java操作redis的客戶端有jedis跟Lettuce。本文主要介紹了springboot集成redis lettuce,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringMVC中使用bean來接收form表單提交的參數(shù)時(shí)的注意點(diǎn)

    SpringMVC中使用bean來接收form表單提交的參數(shù)時(shí)的注意點(diǎn)

    本篇文章主要介紹了SpringMVC中使用bean來接收form表單提交的參數(shù)時(shí)的注意點(diǎn),具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-05-05
  • 聊聊springboot靜態(tài)資源加載的規(guī)則

    聊聊springboot靜態(tài)資源加載的規(guī)則

    這篇文章主要介紹了springboot靜態(tài)資源加載的規(guī)則,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot整合ES解析搜索返回字段問題

    SpringBoot整合ES解析搜索返回字段問題

    這篇文章主要介紹了SpringBoot整合ES解析搜索返回字段問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Netty解決半包和粘包問題的方案

    Netty解決半包和粘包問題的方案

    Netty 是一個(gè)高性能、異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,廣泛應(yīng)用于各種網(wǎng)絡(luò)通信場景,這篇文章,我們將詳細(xì)分析 Netty 是如何解決半包和粘包問題,文中通過代碼示介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xiàn)

    Mybatis-Plus自動(dòng)填充更新操作相關(guān)字段的實(shí)現(xiàn)

    數(shù)據(jù)庫表中應(yīng)該都要有create_time、update_time字段;那么在開發(fā)中,對于這些共有字段的處理應(yīng)該要進(jìn)行統(tǒng)一,這樣就可以簡化我們的開發(fā)過程。那么本文就對Mybatis-Plus中的字段自動(dòng)填充進(jìn)行記錄
    2021-11-11
  • Spring依賴注入與第三方Bean管理基礎(chǔ)詳解

    Spring依賴注入與第三方Bean管理基礎(chǔ)詳解

    依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在 傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例
    2022-12-12
  • Java小項(xiàng)目之迷宮游戲的實(shí)現(xiàn)方法

    Java小項(xiàng)目之迷宮游戲的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Java小項(xiàng)目之迷宮的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java8并行流中自定義線程池操作示例

    Java8并行流中自定義線程池操作示例

    這篇文章主要介紹了Java8并行流中自定義線程池操作,結(jié)合實(shí)例形式分析了并行流的相關(guān)概念、定義及自定義線程池的相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • 基于servlet的執(zhí)行原理與生命周期(全面解析)

    基于servlet的執(zhí)行原理與生命周期(全面解析)

    下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論

田东县| 天峻县| 崇左市| 新竹县| 攀枝花市| 怀集县| 北安市| 荔波县| 喀什市| 建平县| 巨鹿县| 赤峰市| 彭水| 冕宁县| 平舆县| 沁水县| 波密县| 增城市| 杭锦旗| 东安县| 山西省| 个旧市| 新邵县| 新乐市| 正阳县| 凉城县| 宜章县| 泸水县| 邻水| 通道| 罗定市| 象山县| 恩平市| 东乌| 巴彦淖尔市| 九寨沟县| 新宾| 定远县| 夏津县| 类乌齐县| 久治县|