Semaphore 可以理解为一个阈值,正在进行的操作数量不能超过此阈值,可以用来限制资源的访问,或者控制某个队列中对象的个数,也就是控制同时执行的线程的数量。
主要有acquire,release两个方法,第一个是获得锁,拿到锁之后线程继续往下执行,否则等待,release方法是释放锁,这样其他等待线程可以获得锁。
public class SemaphoreTest {
private Semaphore semaphore = new Semaphore(2);
public void m() {
try {
System.out.println(Thread.currentThread().getName()+" started");
semaphore.acquire();
Thread.sleep((int) (Math.random() * 2000));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
System.out.println(Thread.currentThread().getName()+" ended");
}
public static void main(String[] args) {
SemaphoreTest test = new SemaphoreTest();
for (int i=0;i<8; i++) {
new Thread(()->test.m()).start();
}
}
}