可以控制某个资源可被同时访问的个数,通过构造函数设定一定数量的许 可,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许 可。
用法介绍:
package com.grace527.test;
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 exec = Executors.newCachedThreadPool();
//每次只允许5个线程进行访问
final Semaphore semaphore = new Semaphore(5);
//模拟20个客户端同时访问
for (int i = 0; i < 20; i++) {
final int NO = i;
Runnable runnable = new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
//获得访问许可
semaphore.acquire();
System.out.println("access:"+NO);
Thread.sleep((long) (Math.random()*10000));
//释放访问 下面两张图分别是不释放与释放的结果
semaphore.release();
System.out.println("thread:"+NO);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
exec.execute(runnable);
}
exec.shutdown();
}
}
释放:后面的线程可以获取前面线程释放的访问许可
不释放:后面的线程被阻塞