信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。 话不多说,直接上代码
public class SemaphoreDemo {
public static void main(String[] args) {
// 最多三个线程
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 6; i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"\t抢车位");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"\t停车3秒后离开车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}, String.valueOf(i)).start();
}
}
}
结果,semaphore可以控制并发数,设置最多3线程抢车位,抢到车位信号量-1,离开车位后信号量+1。
0 抢车位
2 抢车位
1 抢车位
0 停车3秒后离开车位
1 停车3秒后离开车位
2 停车3秒后离开车位
4 抢车位
3 抢车位
5 抢车位
4 停车3秒后离开车位
3 停车3秒后离开车位
5 停车3秒后离开车位