java限制多线程并发数 关键字 Semaphore

如题:对于单个Java应用,我们如何限制其中某个方法methodA()被调用的并发数不能超过100,如果超过100,超出的请求就直接返回null或抛异常

    private static Semaphore semaphore = new Semaphore(100);
 
    public static Integer methodA() {
        if(!semaphore.tryAcquire()) {
            return null;
        }
 
        try {
        // TODO 方法中的业务逻辑
        } finally {
            semaphore.release();
        }
    }

概念上讲,一个信号量相当于持有一些许可(permits),线程可以调用Semaphore对象的acquire()方法获取一个许可,调用release()来归还一个许可。

1 构造方法: 

Semaphore有两个构造方法 Semaphore(int)、Semaphore(int,boolean),参数中的int表示该信号量拥有的许可数量,boolean表示获取许可的时候是否是公平的,如果是公平的那么,当有多个线程要获取许可时,会按照线程来的先后顺序分配许可,否则,线程获得许可的顺序是不定的。

2 获取许可 

可以使用acquire()、acquire(int)、tryAcquire()等去获取许可,其中int参数表示一次性要获取几个许可,默认为1个,acquire方法在没有许可的情况下,要获取许可的线程会阻塞,而tryAcquire()方法在没有许可的情况下会立即返回 false,要获取许可的线程不会阻塞。

3 释放许可 

线程可调用 release()、release(int)来释放(归还)许可,注意一个线程调用release()之前并不要求一定要调用了acquire

一般都是搭配线程池使用。

  • 作为小菜鸟难免很多地方理解不到位,文中若有错误请直(bu)接(yao)指(ma)出(wo)

猜你喜欢

转载自blog.csdn.net/cyberHerman/article/details/88424444