亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

一:等待多線程完成的CountDownLatch

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

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

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

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

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

二:同步屏障CyclicBarrier

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

package com.fuzhulei;
​
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
​
/**
 * CyclicBarrier是一個加法計數(shù)器,即同步屏障,可循環(huán)的屏障,讓一組線程到達一個屏障(也可以叫做同步點)時被阻塞,直到最后一個線程到達屏障,達到了一開始初始化的屏障的數(shù)值,
 * 屏障才可以打開門,所有被攔截的線程才可以繼續(xù)工作,主要是通過調(diào)用await方法來實現(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)到達屏障");
    },"A").start();
​
    new Thread(()->{
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程B已經(jīng)到達屏障");
    },"B").start();
​
    new Thread(()->{
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程C已經(jīng)到達屏障");
    },"C").start();
​
​
  }
}

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

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

并且程序一直還沒有停止,這就是屏障起到了作用,因為屏障要求至少需要4個(假設),但是此時只有三個線程到達,所以不滿足,屏障就一直阻攔不放路,那么所有的線程也就被阻塞不能向下面繼續(xù)運行,除非知道第四個過來,滿足條件才會運行。

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

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

package com.fuzhulei;
​
import java.util.concurrent.*;
​
/**
 * 用來控制同時訪問特定資源的線程數(shù)量,通過協(xié)調(diào)各個線程,以保證合理的使用公用的資源
 * @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ù)庫資源,假如需要讀取幾十萬個數(shù)據(jù)的文件,因為都是IO密集型任務,所以開了2倍的處理器+1個線程數(shù)(IO密集型,所以線程可以多一些,讓cpu忙起來,因為IO操作的時候,很少操作Cpu)

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

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

相關文章

  • SpringBoot后端接收參數(shù)優(yōu)化代碼示例(統(tǒng)一處理前端參數(shù))

    SpringBoot后端接收參數(shù)優(yōu)化代碼示例(統(tǒng)一處理前端參數(shù))

    使用Spring Boot開發(fā)API的時候,讀取請求參數(shù)是服務端編碼中最基本的一項操作,下面這篇文章主要給大家介紹了關于SpringBoot后端接收參數(shù)優(yōu)化(統(tǒng)一處理前端參數(shù))的相關資料,需要的朋友可以參考下
    2024-07-07
  • Java中的阻塞隊列詳細介紹

    Java中的阻塞隊列詳細介紹

    這篇文章主要介紹了Java中的阻塞隊列詳細介紹的相關資料,需要的朋友可以參考下
    2016-11-11
  • 如何從Java接口的角度切入靜態(tài)工廠模式

    如何從Java接口的角度切入靜態(tài)工廠模式

    靜態(tài)工廠模式是一種改進的獲取實例的方法。通常我們會使用new關鍵字調(diào)用類的構(gòu)造方法來創(chuàng)建一個對象。靜態(tài)工廠可以根據(jù)用戶傳入的參數(shù)來動態(tài)地實例化對象,避免一次性實例化所有對象所帶來的性能浪費,同時也降低了耦合性。
    2021-06-06
  • mybatis typeAliases 給實體類起別名的方法

    mybatis typeAliases 給實體類起別名的方法

    這篇文章主要介紹了mybatis typeAliases 給實體類起別名,本文給大家分享兩種用法,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java自定義長度可變數(shù)組的操作

    Java自定義長度可變數(shù)組的操作

    這篇文章主要介紹了Java自定義長度可變數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java并發(fā)編程之線程間的通信

    Java并發(fā)編程之線程間的通信

    當線程在系統(tǒng)內(nèi)運行時,程序通常無法準確的控制線程的輪換執(zhí)行,但我們可以通過一些機制來保障線程的協(xié)調(diào)運行,本文著重講解線程間的通信機制
    2021-06-06
  • 使用ResponseEntity作為的返回值的應用

    使用ResponseEntity作為的返回值的應用

    這篇文章主要介紹了使用ResponseEntity作為的返回值的應用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java application maven項目打自定義zip包實例(推薦)

    java application maven項目打自定義zip包實例(推薦)

    下面小編就為大家?guī)硪黄猨ava application maven項目打自定義zip包實例(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 淺談HTTP使用BASIC認證的原理及實現(xiàn)方法

    淺談HTTP使用BASIC認證的原理及實現(xiàn)方法

    下面小編就為大家?guī)硪黄獪\談HTTP使用BASIC認證的原理及實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java RabbitMQ的工作隊列與消息應答詳解

    Java RabbitMQ的工作隊列與消息應答詳解

    這篇文章主要為大家詳細介紹了Python實現(xiàn)學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論