Java并发编程工具类之控制并发线程数的Semaphore

Semaphore (信号量)是用来控制同 时访问 特定 源的 线 程数量,它通 过协调 各个 线 程,以
合理的使用公共 源。
计数信号灯。从概念上讲,信号量维护一组许可。每个{@link#acquire}都会在必要时阻塞,直到有许可证可用,然后再获取它。每个{@link#release}都会添加一个许可证,可能会释放一个阻塞收单机构。但是,没有使用实际的许可证对象;{@code信号量}只保留可用数量的计数,并相应地进行操作。
应用场景:
Semaphore 可以用于做流量控制,特 是公用 源有限的 景,比如数据 库连 接。假
如有一个需求,要 取几万个文件的数据,因 都是 IO 密集型任 ,我 可以启 几十个 线
取,但是如果 到内存后, 需要存 到数据 中,而数据 接数只有 10 个,
控制只有 10 线 程同 时获 取数据 库连 接保存数据,否 报错 无法 取数据 库连
接。 候,就可以使用 Semaphore 来做流量控制
package com.netty.obj.demo5.d4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * @PackageName:com.netty.obj.demo5.d4 Description
 * @author:
 * @date:2022/1/12
 */
public class SemaphoreTest {
    private static final int THREAD_COUNT = 30;
    private static ExecutorService threadPool =Executors.newFixedThreadPool(THREAD_COUNT);
    private static Semaphore s = new Semaphore(10);

    public static void main(String[] args) {
        for (int i = 0; i < THREAD_COUNT; i++) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        s.acquire();
                        System.out.println("save data");
                        s.release();
                    } catch (InterruptedException e) {
                    }
                }
            });
        }
        threadPool.shutdown();
    }
}
在代 中, 然有 30 线 程在 行,但是只允 10 个并 发执 行。 Semaphore 的构造方法
Semaphore int permits )接受一个整型的数字,表示可用的 数量。 Semaphore 10 )表示允
10 线 ,也就是最大并 数是 10 Semaphore 的用法也很 简单 ,首先 线 程使用
Semaphore acquire() 方法 取一个 ,使用完之后 release() 方法 归还许 可以
tryAcquire() 方法 尝试获
Semaphore 提供一些其他方法,具体如下。
·intavailablePermits() :返回此信号量中当前可用的 数。
·intgetQueueLength() :返回正在等待 线 程数。
·booleanhasQueuedThreads() :是否有 线 程正在等待
·void reducePermits int reduction ):减少 reduction ,是个 protected 方法。
·Collection getQueuedThreads() :返回所有等待 线 程集合,是个 protected
法。
总结:案例来源《Java并发编程的艺术》,主要熟悉Semaphore的业务应用场景,希望有帮助。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值