-
使用场景:常用于使用有限的资源,限制线程并发的最大数量。
默认情况下,信号量是非公平性的(先等待先执行为公平。类似于买东西的时候大家排队付款,先来的先付款是公平的。但是这时候有人插队,那就是非公平的)
设定信号量的最大个数:Semaphore semaphore=new Semaphore(3);
- 获取信号量:
- semaphore.acquire(); //获取信号量
- semaphore.acquire(3); //获取多个许可
- semaphore.tryAcquire(3); //尝试获取多个许可
- semaphore.tryAcquire(5, TimeUnit.SECONDS); //给定时间内获取许可
- 释放信号量:semaphore.release();
代码:
public class T11_TestSemaphore {
public static void main(String[] args) {
//Semaphore s = new Semaphore(2);
Semaphore s = new Semaphore(2, true);
//允许一个线程同时执行
//Semaphore s = new Semaphore(1);
new Thread(()->{
try {
s.acquire();
System.out.println("T1 running...");
Thread.sleep(200);
System.out.println("T1 running...");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
s.release();
}
}).start();
new Thread(()->{
try {
s.acquire();
System.out.println("T2 running...");
Thread.sleep(200);
System.out.println("T2 running...");
s.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}