百度百科解釋:Semaphore是一種在多線程環境下使用的設施,該設施負責協調各個線程,以保證它們能夠正確、合理的使用公共資源的設施,也是操作系統中用於控制進程同步互斥的量。
Semaphore是java併發包下的一個工具類,可以控制多線程對共享資源的訪問,acquire()獲取一個許可,如果沒有就等待,而release()釋放一個許可。如某個方法只允許最多10個線程併發訪問,則實現代碼如下:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
// 最多10個線程同時訪問
final Semaphore semaphore = new Semaphore(10);
// 20個線程同時啓動
for (int i = 1; i <= 20; i++) {
final int index = i;
exec.execute(new Runnable() {
@Override
public void run() {
try {
// 獲取許可
semaphore.acquire();
// 調用資源
callRomote(index);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 訪問完後,釋放
semaphore.release();
//availablePermits()指的是當前庫中有多少個許可可以被使用
System.out.println("availablePermits => " + semaphore.availablePermits());
}
}
});
}
// 退出線程池
exec.shutdown();
}
/**
* 被調用資源
*
* @param arg
*/
public static void callRomote(int arg) {
System.out.println("arg: " + arg);
try {
Thread.sleep((long) (Math.random() * 6000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}