Semaphore
在進程方面完成信號線的控制,能夠控制某個資源下,可被同時訪問的線程個數。對系統的訪問量進行評估,信號量維護了一個許可集;在許可前會阻塞每個 semaphore.acquire() ,而後再獲取該許可,每個release() 添加一個許可,從而
可能釋放一個正在阻塞的獲取者,可是,不使用實際的許可對象,Semaphore只對可用許可的號碼進去計算,並採起行動,拿到信號量的線程則進入代碼,不然就等待。
semaphore.acquire();//1.獲取許可semaphore.release();//3.訪問完畢,釋放package demo1;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class DemoSemaphore { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); Semaphore semaphore = new Semaphore(3); for (int i=0;i<=20;i++){ final int no =i; Runnable runnable = new Runnable() { @Override public void run() { try { semaphore.acquire();//1.獲取許可 System.err.println("systme:"+no); Thread.sleep((long) (Math.random()*1000));//2.模擬業務耗時 semaphore.release();//3.訪問完畢,釋放 ,若是屏蔽下面的語句,則在控制檯只能打印5條記錄,以後線程一直阻塞 } catch (InterruptedException e) { e.printStackTrace(); }finally { System.err.println("。。。"); } } }; executorService.execute(runnable); } executorService.shutdown(); }}
- 輸出:
- systme:0 systme:1 systme:2 。。。 systme:3 。。。 systme:4 。。。 systme:5 。。。 systme:6 。。。 systme:7 。。。 systme:8 。。。 systme:9 。。。 systme:10 。。。 systme:11 。。。 systme:12 。。。 systme:13 。。。 systme:14 。。。 systme:15 。。。 systme:16 。。。 systme:17 。。。 systme:18 。。。 systme:19 。。。 systme:20 。。。 。。。 。。。