java多线程之Semaphore

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以
保证合理的使用公共资源。

1. 应用场景

Semaphore可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假
如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程
并发地读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这
时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连
接。这个时候,就可以使用Semaphore来做流量控制

2. 示例

    public static void main(String[] args) throws Exception {
        Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i< 20; i++) {
            new Thread( ()-> {
                try {
                    semaphore.acquire();
                    log.info("线程: {} 开始执行", Thread.currentThread().getName());
                    Thread.sleep(2000);
                    log.info("线程: {} 执行结束", Thread.currentThread().getName());
                    semaphore.release();
                } catch (Exception e) {}
            }, "线程" + i).start();
        }
    }

打印结果如下图:


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容