Java 多线程之Semaphore (限流Java 版)

概念

计数信号量。从概念上讲,信号量维护一组许可证。

举一个例子

某银行分店只有三个窗口,所以同一时间最多只有三个人办理业务,其它人只能等待。可以把办理业务的人比作成线程,三个窗口就相当于三个许可证。此时来了4个人,先到的三个领到人许可证然后办理业务,第四个人呢只有等待,等待其中一个先办好业务释放许可证之后,然后再办理业务。

简单的用法

调用aquire方法是阻塞的直到有一个许可可用然后返回。每次调用release方法就会增加一个许可,隐式地释放一个阻塞获取者(调用aquire方法阻塞的线程)。当然没有所谓实际的许可对象Semaphore仅仅是维护了一个数字而已,然后执行相应的减加操作而已。

一个demo?

public class SemaphoreDemo {

    public static final int THREAD_SIZE = 10;

    public static void runSomething() throws InterruptedException {
        //模拟处理什么事
        Thread.sleep(1000);
        System.out.println(String.format("current threadId is %d,current time is %d",
                Thread.currentThread().getId(), System.currentTimeMillis() / 1000));
    }

    public static void main(String[] args) throws InterruptedException {
        //创建一个包含4个许可证的信号量实例
        Semaphore semaphoreDemo = new Semaphore(4);
        for (int i = 0; i < THREAD_SIZE; i++) {
            //获取许可
            Thread demoThread = new Thread(() -> {
                try {
                    //获取许可
                    semaphoreDemo.acquire();
                    //操作资源
                    runSomething();
                } catch (InterruptedException e) {
                    //抛出InterruptedException 会将该线程的中断标志设置为false
                    Thread.currentThread().interrupt();
                } finally {
                    semaphoreDemo.release();
                }
            });
            //开启demo线程
            demoThread.start();

        }

    }
}

上一篇:可用的Java信号量允许使用ThreadPool


下一篇:java面试题——CountDownLatch/CyclicBarrier/Semaphore