seamphore java
时间: 2024-01-14 12:29:55 浏览: 31
信号量(Semaphore)是Java中用于控制多个线程并发访问共享资源的机制之一。它可以用来限制同时访问某个资源的线程数量,以及确保线程按照特定的顺序访问共享资源。
在Java中,Semaphore类位于java.util.concurrent包下。它提供了两个常用的构造方法:
1. Semaphore(int permits):创建一个具有给定许可数的Semaphore对象。
2. Semaphore(int permits, boolean fair):创建一个具有给定许可数和公平性设置的Semaphore对象,其中fair参数决定了获取许可的顺序。
Semaphore类的主要方法包括:
1. acquire():获取一个许可,如果没有可用的许可,则会阻塞直到有可用许可为止。
2. acquire(int permits):获取指定数量的许可,如果没有足够的可用许可,则会阻塞直到有足够数量的可用许可为止。
3. release():释放一个许可。
4. release(int permits):释放指定数量的许可。
下面是一个使用Semaphore的简单示例:
```java
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final int MAX_THREADS = 5;
private static final Semaphore semaphore = new Semaphore(MAX_THREADS);
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(new Worker(i));
thread.start();
}
}
static class Worker implements Runnable {
private int id;
public Worker(int id) {
this.id = id;
}
@Override
public void run() {
try {
System.out.println("Thread " + id + " is waiting for a permit.");
semaphore.acquire();
System.out.println("Thread " + id + " has acquired a permit.");
// 模拟工作
Thread.sleep(2000);
System.out.println("Thread " + id + " is releasing the permit.");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
上述示例中,我们创建了一个Semaphore对象,并将最大许可数设置为5。然后,我们创建了10个工作线程,每个线程在执行工作之前先获取一个许可,执行完工作后释放许可。
通过Semaphore的使用,我们可以限制同时执行工作的线程数量,确保不会超过最大许可数。这在某些场景下可以很有用,比如限制数据库连接数、控制线程池并发数等。