JAVA信号量使用示例程序
时间: 2023-08-21 14:06:27 浏览: 87
信号量使用实例
以下是一个简单的Java信号量使用示例程序:
```java
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3); // 创建一个信号量,初始值为3
// 创建5个线程
for (int i = 1; i <= 5; i++) {
Thread thread = new Thread(new Worker(semaphore, i));
thread.start();
}
}
static class Worker implements Runnable {
private final Semaphore semaphore;
private final int id;
public Worker(Semaphore semaphore, int id) {
this.semaphore = semaphore;
this.id = id;
}
@Override
public void run() {
try {
semaphore.acquire(); // 等待信号量,如果信号量为0则阻塞
System.out.println("Worker " + id + " acquired semaphore");
Thread.sleep(1000); // 模拟工作
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放信号量
System.out.println("Worker " + id + " released semaphore");
}
}
}
}
```
在这个示例程序中,创建了一个初始值为3的信号量。然后创建了5个线程,每个线程都是一个Worker实例,Worker实例的构造函数中传入了信号量和线程ID。每个线程运行时,首先尝试获取信号量,如果信号量为0,则阻塞等待。如果成功获取信号量,就输出一个日志,然后模拟一秒钟的工作时间。最后释放信号量并输出一个日志。
由于信号量的初始值为3,所以前3个线程可以同时获取信号量并运行,后面的两个线程需要等待前面的线程释放信号量后才能获取。输出结果如下:
```
Worker 1 acquired semaphore
Worker 2 acquired semaphore
Worker 3 acquired semaphore
Worker 1 released semaphore
Worker 4 acquired semaphore
Worker 2 released semaphore
Worker 5 acquired semaphore
Worker 3 released semaphore
Worker 4 released semaphore
Worker 5 released semaphore
```
可以看到,前三个线程可以同时获取信号量,后面的两个线程需要等待前面的线程释放信号量后才能获取。这就是信号量的作用。
阅读全文