1. 程式人生 > >併發程式設計-concurrent指南-訊號量Semaphore

併發程式設計-concurrent指南-訊號量Semaphore

Semaphore翻譯成字面意思為 訊號量,Semaphore可以控同時訪問的執行緒個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。

acquire()用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許可。

release()用來釋放許可。注意,在釋放許可之前,必須先獲獲得許可。

下面通過一個例子來看一下Semaphore的具體使用:

假若一個工廠有5臺機器,但是有8個工人,一臺機器同時只能被一個工人使用,只有使用完了,其他工人才能繼續使用。那麼我們就可以通過Semaphore來實現:

import java.util.concurrent.Semaphore;

public class Main { public static void main(String[] args) { Semaphore semaphore = new Semaphore(5);//5臺機器 //8個工人工作 for(int i=0;i<8;i++){ new Thread(new Worker(semaphore)).start(); } } }
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; /** * 工人 */ public class Worker implements Runnable{ private Semaphore semaphore; public Worker(Semaphore semaphore){ this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()
+"佔用一個機器生產。。。"); int random = new Random().nextInt(10); TimeUnit.SECONDS.sleep(random); System.out.println(Thread.currentThread().getName()+"釋放出機器"); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }

 

適用場景:

Semaphore其實和鎖有點類似,它一般用於控制對某組資源的訪問許可權。

 

原始碼地址:https://github.com/qjm201000/concurrent_semaphore.git