java线程并发semaphore类示例


下面是一个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);`来模拟资源访问的耗时操作,并使用了线程的名称来输出日志信息,以便观察线程的执行顺序。在实际应用中,你可能需要替换这部分代码以执行实际的资源访问操作。