有些时候为了防止某些热点功能出现问题,区别于令牌桶等限流情况,需要对单个接口或者代码块进行超时限制;
例如在2秒内你要是不给我返回结果,我就不要了。
实现代码如下:
1.引入jar包
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
2.引用相关代码实现功能:
public static void main(String[] args){
//一定要自己创建线程池,否则它采用默认线程池可能你没有设置线程池上限造成线程问题
ExecutorService executor=Executors.newFixedThreadPool(1);
TimeLimiter tl=new SimpleTimeLimiter(executor);
long timeout=2;//超时时间为2秒
String result;//返回值
try{
result=tl.CallWithTimeout(new Callable<String>(){
@override
public string call() throws Exception{
Thread.sleep(3000);//代替实际代码逻辑
return "正常返回";
}
},timeout,TimeUnit.SECONDS,true);
}catch(Exception e){
System.out.println("超时了");
result=null;
}
}
- TimeLimiter接口带有@Beta注解,所以可能还存在一定的风险,慎用
- 该接口还提供了newProxy()的方式,但是需要改造自己的业务接口,用起来麻烦一点
- 可以进入SimpleTimeLimiter看下实现方式,是采用Future实现,可以对这个东西做下了解,有空尝试自己写一下
- 代码部分引入的创建线程池方式比较简单,设计到线程就尽可能的谨慎处理,详细创建方式可在本站搜索“如何创建Java线程池”