java-实现资源访问的超时和并发控制

实现资源访问的超时和并发控制

线程池

private static ExecutorService exec = new ThreadPoolExecutor(8, 8, 0L,
			TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(100000),
            new ThreadPoolExecutor.AbortPolicy());
try {
	Future<?> future = this.threadPoolExecutor.submit(runnable);
	while (!future.isDone()) {
		future.get(“超时时间”, TimeUnit.SECONDS);
	}
} catch (RejectedExecutionException ree) {
//超过最大并发资源限制,无法提供服务
} catch (TimeoutException e) {
//服务时间超限
} catch (Throwable throwable) {
//产生未知的错误
} finally {
	
}


RateLimiter

RateLimiter使用的是一种叫令牌桶的流控算法,RateLimiter会按照一定的频率往桶里扔令牌,线程拿到令牌才能执行,
比如你希望自己的应用程序QPS不要超过1000,那么RateLimiter设置1000的速率后,就会每秒往桶里扔1000个令牌。
    public static void testWithRateLimiter() {  
        RateLimiter limiter = RateLimiter.create(10.0); // 每秒不超过10个任务被提交  
        for (int i = 0; i < 10; i++) {  
            limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞  
            System.out.println("call execute.." + i);  
        }  
    }

信号量Semaphore

  一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release()获取和释放访问许可。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值