public class SemaphoreDemo {
public static void main(String[] args) {
//信号量,解决了允许固定个数的线程同时访问共享资源
final Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();// 获得许可
System.out.println(Thread.currentThread().getName()
+ ": 来了...现在有"+(3-semaphore.availablePermits())+"位顾客");
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
System.out.println("-->"+Thread.currentThread().getName()
+ ": 走了...");
semaphore.release();// 释放许可
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
Thread-0: 来了...现在有1位顾客
Thread-2: 来了...现在有3位顾客
Thread-1: 来了...现在有2位顾客
-->Thread-2: 走了...
Thread-4: 来了...现在有3位顾客
-->Thread-1: 走了...
Thread-6: 来了...现在有3位顾客
-->Thread-0: 走了...
-->Thread-4: 走了...
Thread-8: 来了...现在有3位顾客
Thread-5: 来了...现在有3位顾客
-->Thread-5: 走了...
Thread-9: 来了...现在有3位顾客
-->Thread-6: 走了...
Thread-3: 来了...现在有3位顾客
-->Thread-3: 走了...
Thread-7: 来了...现在有3位顾客
-->Thread-8: 走了...
-->Thread-9: 走了...
-->Thread-7: 走了...