1. 程式人生 > >java Semaphore的介紹和使用

java Semaphore的介紹和使用

一個 lease 操作 cnblogs 偽代碼 數據 app println pool

一個計數信號量。從概念上講,信號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然後再獲取該許可。每個 release() 添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進行計數,並采取相應的行動。拿到信號量的線程可以進入代碼,否則就等待。通過acquire()和release()獲取和釋放訪問許可。

舉例說明:假如你在設計一個數據庫讀取程序,使用該程序的人比較多暫定20個,但同時只允許有5個客戶端使用該程序對數據庫操作,只前面有釋放才可以後面的程序使用

偽代碼如下:

import java.util.concurrent.*;

/** * by lv xiao long * */ public class App { public static void main( String[] args ) { // 線程池 ExecutorService exec = Executors.newCachedThreadPool(); // 模擬只能5個客戶端同時訪問 final Semaphore semp = new Semaphore(5); // 模擬20個客戶端訪問 for (int index = 0
; index < 20; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { // 獲取許可 semp.acquire(); System.out.println("Accessing: "
+ NO); Thread.sleep((long) (Math.random() * 10000)); // 訪問完後,釋放 ,如果屏蔽下面的語句,則在控制臺只能打印5條記錄,之後線程一直阻塞 semp.release(); } catch (InterruptedException e) { } } }; exec.execute(run); } // 退出線程池 exec.shutdown(); } }

java Semaphore的介紹和使用