Java编写超时工具类实例讲解
我们在开发过程中,在进行时间操作时,如果在规定的时间内完成处理的话,有可能会回到正确的结果。否则,就会被视为超时任务。此时,我们不再等待(不再执行)的时间操作,直接向调用者传达这个任务需要时间,被取消了。
1、说明
java已经为我们提供了解决办法。jdk1.5带来的并发库Future类可以满足这一需求。Future类中重要的方法有get()和cancel()。get()获取数据对象,如果数据没有加载,则在获取数据之前堵塞,cancel()取消数据加载。另一个get(timeout)操作表明,如果timeout时间内没有得到,就会失败回来,不会堵塞。
利用泛型和函数式接口编写一个工具类,可以让超时处理更方便,而不用到处写代码。
2、实例
/** *TimeoutUtil
* *@authorlys *@date2021/2/25 */ @Slf4j @Component @NoArgsConstructor publicclassTimeoutUtil{ privateExecutorServiceexecutorService; publicTimeoutUtil(ExecutorServiceexecutorService){ this.executorService=executorService; } /** *有超时限制的方法 * *@parambizSupplier业务函数 *@paramtimeout超时时间,ms *@return返回值 */ publicResult doWithTimeLimit(Supplier bizSupplier,inttimeout){ returndoWithTimeLimit(bizSupplier,null,timeout); } /** *有超时限制的方法 * *@parambizSupplier业务函数 *@paramdefaultResult默认值 *@paramtimeout超时时间,ms *@return返回值 */ public Result doWithTimeLimit(Supplier bizSupplier,RdefaultResult,inttimeout){ Rresult; StringerrMsg="Nullvalue"; FutureTask futureTask=newFutureTask<>(bizSupplier::get); executorService.execute(futureTask); try{ result=futureTask.get(timeout,TimeUnit.MILLISECONDS); }catch(InterruptedException|ExecutionException|TimeoutExceptione){ errMsg=String.format("doWithTimeLimit执行超过%d毫秒,强制结束",timeout); log.error(errMsg,e); futureTask.cancel(true); result=defaultResult; } returnof(result,errMsg); } /** *随机耗时的测试方法 */ privateStringrandomSpentTime(){ Randomrandom=newRandom(); inttime=(random.nextInt(10)+1)*1000; log.info("预计randomSpentTime方法执行将耗时:"+time+"毫秒"); try{ Thread.sleep(time); }catch(Exceptione){ } return"randomSpentTime-->"+time; } publicstaticvoidmain(String[]args)throwsException{ ExecutorServiceexecutorService=newThreadPoolExecutor(1,1, 0L,TimeUnit.MILLISECONDS, newLinkedBlockingQueue (), runnable->{ Threadthread=newThread(runnable); //以守护线程方式启动 thread.setDaemon(true); returnthread; }); TimeoutUtiltimeoutUtil=newTimeoutUtil(executorService); for(inti=1;i<=10;i++){ log.info("\n=============第{}次超时测试=============",i); Thread.sleep(6000); longstart=System.currentTimeMillis(); Stringresult=timeoutUtil.doWithTimeLimit(()->timeoutUtil.randomSpentTime(),5000).getOrElse("默认"); log.info("doWithTimeLimit方法实际耗时{}毫秒,结果:{}",System.currentTimeMillis()-start,result); } } }
实例知识点扩展:
属性校验工具类
/** *校验对象中的属性。如果属性为null,抛异常。如果属性为字符串(空串或空格),抛异常。 *@authormex *@date2019年4月18日 *@parame对象 *@paramfieldNames属性名称数组 *@returnvoid *@throwsException */ publicstaticvoidvalidateAttr(Ee,String[]fieldNames)throwsException{ if(null==e){ thrownewException("请求对象为空"); } if(null==fieldNames){ return; } for(inti=0;i 到此这篇关于Java编写超时工具类实例讲解的文章就介绍到这了,更多相关Java编写超时工具类内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。