1. 程式人生 > >JAVA中的併發工具類(一)----控制併發數的Semaphore

JAVA中的併發工具類(一)----控制併發數的Semaphore

本文使用的Demo可以在我的github中找到。
前面我們使用執行緒池技術來控制訪問資源的執行緒數目,假設對某一檔案的訪問,我們允許幾十個執行緒來讀他,但是出於某種限制,我們要求只允許10個執行緒可以同時讀該檔案。這就好比十字路口有100輛車想要過馬路,我們只允許其中的10輛車可以看到綠燈然後讓他們通過馬路。Semaphore就類似於這種情境下的紅綠燈。

Semaphore的應用場景:可以用於做流量控制,特別是共用資源有限的應用場景,比如資料庫連線。幾十個執行緒要求訪問資料庫,但是我們只提供10個連線數,這個時候,我們可以使用Semaphore來做流量控制。

示例Demo:

import java.util
.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); // 規定一個執行緒池 final Semaphore sp = new Semaphore(3
); // 允許最大併發數為3 for (int i = 0; i < 10; i++) { // 開啟十個執行緒。 Runnable runnable = new Runnable() { public void run() { try { sp.acquire
(); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println( "執行緒" + Thread.currentThread().getName() + "進入,當前已有" + (3 - sp.availablePermits()) + "個併發"); try { Thread.sleep((long) (Math.random() * 10000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("執行緒" + Thread.currentThread().getName() + "即將離開"); sp.release(); // 下面程式碼有時候執行不準確,因為其沒有和上面的程式碼合成原子單元 System.out.println( "執行緒" + Thread.currentThread().getName() + "已離開,當前已有" + (3 - sp.availablePermits()) + "個併發"); } }; service.execute(runnable); } service.shutdown(); } }

執行結果如下:

執行緒pool-1-thread-2進入,當前已有3個併發
執行緒pool-1-thread-1進入,當前已有3個併發
執行緒pool-1-thread-3進入,當前已有3個併發
執行緒pool-1-thread-1即將離開
執行緒pool-1-thread-1已離開,當前已有3個併發
執行緒pool-1-thread-4進入,當前已有3個併發
執行緒pool-1-thread-4即將離開
執行緒pool-1-thread-4已離開,當前已有2個併發
執行緒pool-1-thread-5進入,當前已有3個併發
執行緒pool-1-thread-5即將離開
執行緒pool-1-thread-5已離開,當前已有2個併發
執行緒pool-1-thread-7進入,當前已有3個併發
執行緒pool-1-thread-3即將離開
執行緒pool-1-thread-3已離開,當前已有2個併發
執行緒pool-1-thread-8進入,當前已有3個併發
執行緒pool-1-thread-2即將離開
執行緒pool-1-thread-2已離開,當前已有2個併發
執行緒pool-1-thread-10進入,當前已有3個併發
執行緒pool-1-thread-8即將離開
執行緒pool-1-thread-6進入,當前已有3個併發
執行緒pool-1-thread-8已離開,當前已有3個併發
執行緒pool-1-thread-6即將離開
執行緒pool-1-thread-6已離開,當前已有2個併發
執行緒pool-1-thread-9進入,當前已有3個併發
執行緒pool-1-thread-9即將離開
執行緒pool-1-thread-9已離開,當前已有2個併發
執行緒pool-1-thread-7即將離開
執行緒pool-1-thread-7已離開,當前已有1個併發
執行緒pool-1-thread-10即將離開
執行緒pool-1-thread-10已離開,當前已有0個併發

相關推薦

JAVA併發工具----控制併發Semaphore

本文使用的Demo可以在我的github中找到。 前面我們使用執行緒池技術來控制訪問資源的執行緒數目,假設對某一檔案的訪問,我們允許幾十個執行緒來讀他,但是出於某種限制,我們要求只允許10個執行緒可以同時讀該檔案。這就好比十字路口有100輛車想要過馬路,我們只

併發工具控制併發執行緒Semaphore

簡介 Semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。很多年以來,我都覺得從字面上很難理解Semaphore所表達的含義,只能把它比作是控制流量的紅綠燈,比如XX馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的都必須

併發工具控制併發執行緒的數量 Semphore

前言   JDK中為了處理執行緒之間的同步問題,除了提供鎖機制之外,還提供了幾個非常有用的併發工具類:CountDownLatch、CyclicBarrier、Semphore、Exchanger、Phaser;   CountDownLatch、Cycl

併發工具等待多執行緒完成的CountDownLatch

簡介 CountDownLatch 允許一個或多個執行緒等待其他執行緒完成操作。 應用場景 假如有這樣一個需求,當我們需要解析一個Excel裡多個sheet的資料時,可以考慮使用多執行緒,每個執行緒解析一個sheet裡的資料,等到所有的sheet都解析完之後,程式需要提示解析完成。在這個需求中

java常用工具—— Map 與 Bean 之間的互相轉換

import net.bytebuddy.implementation.bytecode.Throw; import org.springframework.cglib.beans.BeanMap; import java.beans.PropertyDescriptor; import java.lang

JAVA常用工具--------------RedisConfig工具

Redis快取用的越來越多,那麼我們是如何使用的Redis? 一,redis的視覺化app 這個是目前比較流行的redis視覺化app。 這是執行狀態的redis,一共擁有16個數據庫,預設儲存在db0裡面。具體儲存的格式,我在 Redis實用教程-----

Java多執行緒-併發工具等待多執行緒完成的CountDownLatch

參考:https://www.jianshu.com/p/1716ce690637http://ifeve.com/talk-concurrency-countdownlatch/CountDownLatch是什麼CountDownLatch也叫閉鎖,在JDK1.5被引入,允

Java的反射機制

erl void port 令行 sage [0 ray 輸出 我們 基本概念   在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?   答案是肯定的。   這種動態獲取類的信息以及動態調用對象的方法的功能

JAVA的枚舉

enum 枚舉 在實際編程中,往往存在著這樣的“數據集”,它們的數值在程序中是穩定的,而且“數據集”中的元素是有限的。例如星期一到星期日七個數據元素組成了一周的“數據集”,春夏秋冬四個數據元素組成了四季的“數據集”。在Java中想表示這種數據集最容易想到的寫法可能是這樣,我們以表示一周五天的工作日來舉

Java的線程

java線程一、線程與進程 談到線程,那就不得不提進程,很久之前其實並沒有線程,只有進程,當一個程序需要運行的時候,必然需要使用系統資源和CPU,因此進程就擔任了對一個應用程序進行資源分配以及CPU調度這兩項職責。後來,為了進一步提高並發執行和資源利用的效率,提出了線程的概念,將進程作了細分,進程將負責資源

並發工具等待多線程的CountDownLatch

err 更多 表示 amp throw new 所有 barrier let 前言 ??JDK中為了處理線程之間的同步問題,除了提供鎖機制之外,還提供了幾個非常有用的並發工具類:CountDownLatch、CyclicBarrier、Semphore、Exchanger、

Java各種集合總結

分享圖片 link 抽象類 解決 集合 1.0 分享 arr 抽象 (一)集合與數組 數組:(存基本數據類型)-->存對象的一種容器,長度固定,【不適合在對象數量未知的情況下使用】 集合:(存對象,對象類型可以不一樣)-->長度可變,可在多數情況下使用。 (二)

Java的Object 下篇

 要麼讀書,要麼旅行,身體和心靈總有一個要在路上。——羅馬假日  上篇我們講了hashCode和equals方法,首先我們先回顧一下 hashCode是根據一定的規則和物件相關的資訊對映成一個數值,這個數值成為雜湊值。他是由native關鍵字修飾的,nat

Java的IO流

一,IO流的分類   A,按照操作的物件不同可分為位元組流與字元流   B,按照流的方向不同可分為輸入(指從外部儲存裝置拿檔案到記憶體)流也叫讀與輸出(指從記憶體把檔案寫入到外部儲存裝置)流也叫寫   注:位元組流可以操作任何型別的檔案,字元流是後來才出現的,主要用來操作字元類的檔案;字元流的出現源於編

常用工具:FileUtile 檔案相關操作

常用工具類(一):FileUtile 檔案相關操作 public class FileUtil { private static final Logger logger = LoggerFactory.getLogger(FileUtils.class); //讀取檔案

JavaSocket的用法 普通Socket的簡單用法

Java中網路通訊是通過Socket實現的,Socket分為ServerSocket和Socket兩大類,ServerSocket用於服務端,可以通過accept方法監聽請求,監聽到請求後返回Socket,Socket用於具體完成資料傳輸,客戶端直接使用Socket發起請求並

併發工具同步屏障CyclicBarrier

簡介 CyclicBarrier 的字面意思是可迴圈使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組執行緒到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續幹活。CyclicBarrier預設的構造方法是Cyc

併發工具兩個執行緒進行資料交換的Exchanger

簡介 Exchanger(交換者)是一個用於執行緒間協作的工具類。Exchanger用於進行執行緒間的資料交換。它提供一個同步點,在這個同步點兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchange方法交換資料, 如果第一個執行緒先執行exchange方法,它會一直等待第二個執行緒也執行

執行緒同步工具控制併發訪問資源

宣告:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 譯者:鄭玉婷     控制併發訪問資源 這個指南,你將學習怎樣使用Java語言提供的Semaphore機制。Semaphore是一個控制訪問多個共享

拔:Java 的泛型

目錄 1 泛型 1.1 為什麼需要泛型 1.2 型別引數命名規約 2 泛型的簡單實用 2.1 最基本最常用 2.2 簡單泛型類 2.2.1 非泛型類 2.2.2 泛型類的定義 2.2.3 泛型類的使用