实现资源访问的超时和并发控制
线程池
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()获取和释放访问许可。
java-实现资源访问的超时和并发控制
最新推荐文章于 2021-11-20 22:28:54 发布