Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

semaphore java

作者:涅盘の梦   发布日期:2025-06-27   浏览:41

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();
        }
    }
}

解释说明

  1. Semaphore初始化:

    • Semaphore semaphore = new Semaphore(3); 创建了一个信号量对象,初始时有3个许可。这意味着最多允许3个线程同时访问临界区。
  2. 线程创建和启动:

    • 使用for循环创建了5个线程,每个线程都运行Worker类的实例。
    • new Thread(new Worker(semaphore, "Thread-" + i)).start(); 启动线程并传递信号量对象给Worker构造函数。
  3. 请求许可:

    • Worker类的run方法中,线程调用semaphore.acquire()请求一个许可。
    • 如果当前可用许可数大于等于1,则线程获得许可并继续执行;否则,线程会被阻塞,直到有其他线程释放许可。
  4. 模拟工作:

    • doWork()方法模拟线程在临界区的工作,这里简单地让线程休眠2秒。
  5. 释放许可:

    • 工作完成后,线程调用semaphore.release()释放许可,使其他等待的线程可以获取许可并继续执行。

通过这种方式,Semaphore可以帮助控制对共享资源的并发访问,确保不会超过设定的最大并发数。

上一篇:java file转base64

下一篇:java 判断字符串是否为数字

大家都在看

java连接数据库的代码

ubuntu 卸载java

java sort用法

java collections.sort

java file类的方法

java 判断

java时间数据类型

java 时间加一天

java demo

java 截取

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站