import java.util.concurrent.Semaphore;
public class SemaphoreExample {
public static void main(String[] args) {
// 创建一个Semaphore对象,指定许可数量为3
Semaphore semaphore = new Semaphore(3);
// 创建5个线程来模拟资源访问
for (int i = 0; i < 5; i++) {
new Thread(new Worker(semaphore, "Thread-" + i)).start();
}
}
}
class Worker implements Runnable {
private final Semaphore semaphore;
private final String name;
public Worker(Semaphore semaphore, String name) {
this.semaphore = semaphore;
this.name = name;
}
@Override
public void run() {
try {
// 请求一个许可
System.out.println(name + " is waiting for a permit.");
semaphore.acquire();
System.out.println(name + " acquired a permit.");
// 模拟资源使用
doWork();
// 释放许可
System.out.println(name + " is releasing the permit.");
semaphore.release();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
private void doWork() {
try {
// 模拟工作时间
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
Semaphore初始化:
Semaphore semaphore = new Semaphore(3);
创建了一个信号量对象,初始时有3个许可。这意味着最多允许3个线程同时访问临界区。线程创建和启动:
for
循环创建了5个线程,每个线程都运行Worker
类的实例。new Thread(new Worker(semaphore, "Thread-" + i)).start();
启动线程并传递信号量对象给Worker
构造函数。请求许可:
Worker
类的run
方法中,线程调用semaphore.acquire()
请求一个许可。模拟工作:
doWork()
方法模拟线程在临界区的工作,这里简单地让线程休眠2秒。释放许可:
semaphore.release()
释放许可,使其他等待的线程可以获取许可并继续执行。通过这种方式,Semaphore
可以帮助控制对共享资源的并发访问,确保不会超过设定的最大并发数。
上一篇:java file转base64
下一篇:java 判断字符串是否为数字
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站