package player.kent.chen.learn.semaphore;
import java.util.concurrent.Semaphore;
public class HelloSemaphore {
private static final class Room {
//信号量作为共享资源的属性
private Semaphore semaPhore = new Semaphore(3, true); //每次只允许3个人在房内
public void take() throws InterruptedException {
try {
semaPhore.acquire();
System.out.println(Thread.currentThread().getName() + " is now in the room");
Thread.sleep(3000);
} finally {
semaPhore.release();
}
}
}
private static final class Guest implements Runnable {
private Room room;
/**
* 进出房间的人
*/
public Guest(Room room) {
super();
this.room = room;
}
public void run() {
while (true) {
try {
room.take();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public static void main(String[] args) {
Room room = new Room();
Thread[] threads = new Thread[10];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new Guest(room));
threads[i].setName("Thread-No-" + i);
}
for (Thread thread : threads) {
thread.start();
}
}
}
观察控制台输出,可见每次只有3个线程获得资源