使用Semaphore控制某个方法允许并发访问的线程的个数

Semaphore两个重要的方法就是

semaphore.acquire() 请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)

semaphore.release() 释放一个信号量,此时信号量个数+1

public class SemaphoreTest {
    private Semaphore mSemaphore = new Semaphore(5);
    public void run(){
        for(int i=0; i< 100; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    test();
                }
            }).start();
        }
    }

    private void test(){
        try {
            mSemaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 进来了");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 出去了");
        mSemaphore.release();
    }
}

示例中实例化了具有5个信号量的semaphore,保证只有5个线程在执行test方法

04-18 17:05:46.350 14192-14228/com.tongxt.myapplication I/System.out: Thread-1228 进来了
04-18 17:05:46.351 14192-14231/com.tongxt.myapplication I/System.out: Thread-1231 进来了
04-18 17:05:46.354 14192-14233/com.tongxt.myapplication I/System.out: Thread-1233 进来了
04-18 17:05:46.354 14192-14232/com.tongxt.myapplication I/System.out: Thread-1232 进来了
04-18 17:05:46.355 14192-14234/com.tongxt.myapplication I/System.out: Thread-1234 进来了

04-18 17:05:47.351 14192-14228/com.tongxt.myapplication I/System.out: Thread-1228 出去了
04-18 17:05:47.351 14192-14236/com.tongxt.myapplication I/System.out: Thread-1236 进来了
04-18 17:05:47.352 14192-14231/com.tongxt.myapplication I/System.out: Thread-1231 出去了
04-18 17:05:47.352 14192-14235/com.tongxt.myapplication I/System.out: Thread-1235 进来了
04-18 17:05:47.354 14192-14233/com.tongxt.myapplication I/System.out: Thread-1233 出去了
04-18 17:05:47.354 14192-14237/com.tongxt.myapplication I/System.out: Thread-1237 进来了
04-18 17:05:47.354 14192-14232/com.tongxt.myapplication I/System.out: Thread-1232 出去了
04-18 17:05:47.354 14192-14229/com.tongxt.myapplication I/System.out: Thread-1229 进来了
04-18 17:05:47.356 14192-14234/com.tongxt.myapplication I/System.out: Thread-1234 出去了
04-18 17:05:47.356 14192-14230/com.tongxt.myapplication I/System.out: Thread-1230 进来了
04-18 17:05:48.351 14192-14236/com.tongxt.myapplication I/System.out: Thread-1236 出去了


Semaphore(信号量)是Java中的一个同步控制工具类,它可以用来控制对共享资源的访问数量。在单线程并发的场景中,Semaphore通常用于控制资源的并发访问次数,以确保不会超出资源的处理能力。 在单线程并发使用中,通常只有一个线程访问受保护的资源,但可能会有多个并发的请求需要处理。通过 Semaphore,我们可以限制同时进行的处理数量,使得线程以一定的速率处理请求,而不是让线程在资源不可用时就直接阻塞,从而提高系统的吞吐量和资源的利用率。 以下是如何在单线程并发的场景中使用Semaphore的一个例子: 1. 创建一个Semaphore实例,并指定并发访问的最大数量。 2. 在请求处理逻辑中,调用`acquire()`方法获取信号量,如果信号量已经被其他请求占用,则当前线程将阻塞等待,直到有信号量可用。 3. 处理完请求后,调用`release()`方法释放信号量,使得其他线程可以继续获取信号量执行请求。 示例代码如下: ```java import java.util.concurrent.Semaphore; public class SingleThreadedConcurrency { private Semaphore semaphore; public SingleThreadedConcurrency(int permits) { semaphore = new Semaphore(permits); // 创建一个信号量,最大并发数为permits } public void processRequest() { try { semaphore.acquire(); // 尝试获取信号量,如果没有可用的信号量,则线程将阻塞 // 处理请求的代码逻辑... } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { semaphore.release(); // 释放信号量,允许其他线程进入 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值