RateLimit
来源:互联网 发布:免费聊天交友软件 编辑:程序博客网 时间:2024/06/06 01:34
RateLimiter limiter = RateLimiter.create(4.0); //每秒不超过4个任务被提交limiter.acquire(); //请求RateLimiter, 超过permits会被阻塞executor.submit(runnable); //提交任务
If(limiter.tryAcquire()){ //未请求到limiter则立即返回false doSomething();}else{ doSomethingElse();}
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>14.0.1</version> </dependency>
import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit; import com.google.common.util.concurrent.FutureCallback;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import com.google.common.util.concurrent.ListeningExecutorService;import com.google.common.util.concurrent.MoreExecutors;import com.google.common.util.concurrent.RateLimiter; public class ListenableFutureDemo { public static void main(String[] args) { testRateLimiter(); testListenableFuture(); } /** * RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数 */ public static void testRateLimiter() { ListeningExecutorService executorService = MoreExecutors .listeningDecorator(Executors.newCachedThreadPool()); RateLimiter limiter = RateLimiter.create(5.0); // 每秒不超过4个任务被提交 for (int i = 0; i < 10; i++) { limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞 final ListenableFuture<Integer> listenableFuture = executorService .submit(new Task("is "+ i)); } } public static void testListenableFuture() { ListeningExecutorService executorService = MoreExecutors .listeningDecorator(Executors.newCachedThreadPool()); final ListenableFuture<Integer> listenableFuture = executorService .submit(new Task("testListenableFuture")); //同步获取调用结果 try { System.out.println(listenableFuture.get()); } catch (InterruptedException e1) { e1.printStackTrace(); } catch (ExecutionException e1) { e1.printStackTrace(); } //第一种方式 listenableFuture.addListener(new Runnable() { @Override public void run() { try { System.out.println("get listenable future's result " + listenableFuture.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }, executorService); //第二种方式 Futures.addCallback(listenableFuture, new FutureCallback<Integer>() { @Override public void onSuccess(Integer result) { System.out .println("get listenable future's result with callback " + result); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }); }} class Task implements Callable<Integer> { String str; public Task(String str){ this.str = str; } @Override public Integer call() throws Exception { System.out.println("call execute.." + str); TimeUnit.SECONDS.sleep(1); return 7; }}
package ratelimite; import com.google.common.util.concurrent.RateLimiter; public class RateLimiterDemo { public static void main(String[] args) { testNoRateLimiter(); testWithRateLimiter(); } public static void testNoRateLimiter() { Long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { System.out.println("call execute.." + i); } Long end = System.currentTimeMillis(); System.out.println(end - start); } public static void testWithRateLimiter() { Long start = System.currentTimeMillis(); RateLimiter limiter = RateLimiter.create(10.0); // 每秒不超过10个任务被提交 for (int i = 0; i < 10; i++) { limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞 System.out.println("call execute.." + i); } Long end = System.currentTimeMillis(); System.out.println(end - start); } }
阅读全文
0 0
- RateLimit
- Google: RateLimit
- 修改openstack的nova-api的ratelimit
- RateLimit--使用guava来做接口限流
- RateLimit--使用guava来做接口限流
- RateLimit--使用guava来做接口限流
- RateLimit--使用guava来做接口限流
- Guava来做接口限流RateLimit
- golang 令牌桶限速器实现(ratelimit)
- 服务接口的流量控制策略之RateLimit
- 2016年校招编程笔试题汇总 考点:冒泡排序(稳定排序)、不考虑大小写特殊情况、判断字符串是否包含另一个字符串、判断某个字符串中含有某个字符串的个数
- 支持向量机详解
- 康托展开和逆康托展开
- html5移动开发屏幕宽度相关概念
- TensorFlow深度学习框架
- RateLimit
- 给初学者的RxJava2.0教程(三)
- jdbcTemplate 实现查询返回list
- enum 枚举的使用
- java-07
- AndroidStudio git版本控制
- serializeArray()与 serialize()
- 实现同环比的简单SQL
- counting-sort