Semaphore(信号量),用于控制同时进入一个方法的线程数量,多个信号量配合,可以实现线程同步。
Semaphore对象在创建时,会指定线程数量。
private final Semaphore semaphore = new Semaphore(5);
常用的方法有两个:
- acquire():线程尝试获取信号量,获取成功时信号量内部的允许进入的线程数量会减1,当数量为0时,新进入的线程会在这里阻塞。
- release():线程释放信号量,信号量内部的允许进入的线程数量加1。
通常使用步骤是:
在需要同步控制的方法进入的地方调用 acquire() 获取信号量,在退出方法的时候调用 release() 释放信号量。
以下代码控制同时只有5个线程可以进入方法
public class SemaphoreTest {
private final Semaphore semaphore = new Semaphore(5);
public static void main(String[] args) {
new SemaphoreTest().test();
}
private void test() {
for (int i = 0; i < 50; i++) {
new Thread(this::method, "thread " + i).start();
}
}
private void method() {
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " enter");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " exit");
semaphore.release();
}
}