Java 信号量 Semaphore
Java信号量在多线程环境下被广泛使用,实现控制某个资源被同时访问的个数。semaphore.acquire()获取许可证,不能获取许的线程变成waiting状态,加入等待队列。semaphore.release()释放许可证。通过的对资源竞争程度控制,保证系统的可用性。Semaphore(int permits, boolean fair);permits同时访问的资源个数,fair是否是公平获取信号量。
Semaphore案例:
public class SemaphoreTest {
public static void main(String[] args) throws Exception {
ExecutorService threadPool = Executors.newFixedThreadPool(10);
final Semaphore semaphore = new Semaphore(5, false);
for (int i = 0; i < 100; i++) {
final int number = i + 1;
Runnable run = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("access.." + number);
Thread.sleep(1000);
semaphore.release();
System.out.println("*" + semaphore.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
threadPool.execute(run);
}
threadPool.shutdown();
}
}
输出结果:
access..2
access..4
access..1
access..3
access..5
*4
access..10
*1
*4
*0
*4
access..9
access..8
access..7
access..6
*1
*4
*2
*4
*5