下面是一个Java中使用Semaphore(信号量)来控制线程并发的简单示例。Semaphore通常用于限制对某个共享资源的访问数量。
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
// 创建一个Semaphore对象,参数1表示允许1个线程同时访问
private final Semaphore semaphore = new Semaphore(1);
public void accessResource() {
try {
// 请求一个许可
semaphore.acquire();
// 模拟资源访问,这里使用sleep来模拟耗时操作
System.out.println(Thread.currentThread().getName() + " 获得了许可,开始访问资源...");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " 访问资源完毕,释放许可...");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 释放许可
semaphore.release();
}
}
public static void main(String[] args) {
SemaphoreExample example = new SemaphoreExample();
// 创建并启动10个线程来模拟并发访问
for (int i = 0; i < 10; i++) {
new Thread(() -> example.accessResource(), "线程-" + (i + 1)).start();
}
}
}
在这个例子中,`Semaphore`的构造函数被初始化为1,表示在任何时候,只有一个线程能够访问被保护的资源。`accessResource`方法首先尝试通过`semaphore.acquire()`获取一个许可。如果许可可用,则线程继续执行;否则,线程将被阻塞,直到许可变得可用。在访问完资源后,线程通过`semaphore.release()`释放许可,以便其他线程可以访问资源。
请注意,这个示例使用了`Thread.sleep(1000);`来模拟资源访问的耗时操作,并使用了线程的名称来输出日志信息,以便观察线程的执行顺序。在实际应用中,你可能需要替换这部分代码以执行实际的资源访问操作。