我们在开发的时候,常常会有这样的需要,需要保证某个操作只运行一段时间,如果超时了,就执行对应的超时操作。
比如,在读取网络请求的时候,我们希望3秒内能读到数据,如果超过了3秒没有读到,那么就不读了,提示用户,超时了,需要重试。
比如,我们开启了一个进程来执行一条命令,这个命令可能是批量处理一批文件并生成一个报告,或者其它,我们知道这个命令肯定不会执行超过30分钟,那么,我们需要给它设定一个时间,如果超时了,那么我们就杀掉该进程, 并清除掉错误的生成数据。
比如,我们通过USB接口将设备如电纸书,MP4等连接到电脑,如果尝试连接了一段时间而没有连接上,那么会给出指导,让用户检查设备或者进行重试。
诸如此类,还有很多。
对于第一种情况,我们还有选择,例如,我们可以通过设置socket的timeout时间来达到这个目的,但是对于大多数情况,它们都没有给我们太多这样原生的方式进行选择。
但是,对于这样的需求,apache-common-exec包中的WatchDog还是给了我们一个很好的例子。
这是一个简单的监听者模式的实现,WatchDog是Subject,TimeoutObserver自然就是Observer,从上图可以看出,WatchDog有着经典Subject的3个职责:
1. 管理Observer的职责,如addTimeoutObserver(),removeTimeoutObserver()方法
2. 触发Observer的职责,如fireTimeoutOccured()
3. 自己本身的业务逻辑,在run()方法中。
从类图上看,可以看出WatchDog类实现了Runnable接口,它在运行时实际上是一个deamon线程,看它的start()方法的实现:
public synchronized void start() {
stopped = false;
Thread t = new Thread(this, "WATCHDOG");
t.setDaemon(true);
t.start();
}
而它自己本身的业务逻辑则很简单,就是判断什么时候超时然后触发TimeoutObserver的timeoutOccured(w : Watchdog) : void 方法:
public synchronized void run() {
final long until = System.currentTimeMillis() + timeout;
long now;
while (!stopped && until > (now = System.currentTimeMillis())) {
try {
wait(until - now);
} catch (InterruptedException e) {
}
}
if (!stopped) {
fireTimeoutOccured(); //trigger TimeoutObserver#timeoutOccred() operation
}
}
protected final void fireTimeoutOccured() {
Enumeration e = observers.elements();
while (e.hasMoreElements()) {
((TimeoutObserver) e.nextElement()).timeoutOccured(this);
}
}
代码很简单,是不是?当我们有超时了需要进行某种操作的需求时,只需要将你需要进行的操作放到实现了TimeoutObserver接口的类中,比如:
public class NotifyUserTimeout implements TimeoutObserver {
@Override
public void timeoutOccured(Watchdog w) {
System.out.println("Timeout happens.. exit the applicaton now");
System.exit(-1);
}
}
然后调用WatchDog类进行超时时间的设置以及注册实现的TimeoutObserver即可。
static main(args) {
Watchdog watchDog=new Watchdog(3000);//set timeout for 3 seconds
watchDog.addTimeoutObserver new NotifyUserTimeout()
watchDog.start();
//simulate time-consuming task..
Thread.sleep 5000
println "finish normally.."
}
从上可以看到,我们模拟了正常的操作大概需要5秒,但是设置了超时的时限为3秒,当正常的操作超时后,会进行提示用户并且退出,上面的例子的结果输出为:
Timeout happens.. exit the applicaton now
看吧,两个简单的类,一个经典的设计模式,便很好的诠释了超时了该怎么办这个需求。如果你有这样的需求,不妨去试一试。
- 大小: 5.8 KB
分享到:
相关推荐
oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法,需要的朋友可以参考一下
当尝试下载`gradle-8.0-bin.zip`时,有时可能会遇到下载超时的问题。这可能是由于多种原因造成的,包括网络连接不稳定、服务器负载过高或者下载源的速度限制等。 1. **网络问题**:下载超时的首要原因可能是网络...
《SCPI安柏-AT526仪表测量与LabVIEW串口通信详解》 在现代电子测量领域,数据采集和分析扮演着...这一技术的应用不仅简化了手动操作,提高了工作效率,而且为数据分析提供了便利,是现代电子测量领域的重要实践之一。
ora-12170 tns 连接超时问题解决方案 在本文中,我们将讨论 ora-12170 tns 连接超时问题的解决方案,该问题常见于客户端无法连接到服务器的情况。本文将从三个方面入手,分别是 tns 配置文件、服务器防火墙和路由...
基于Netty使用JSerialComm进行串口读取的更新库源代码(Netty-Transport-jSerialComm-master2.0.0),1)依赖的Netty从 4.1.13.Final版本升级到 4.1.82.Final版本2)依赖的jSerialComm 从1.3.11版本升级到2.9.2版本3...
"电信设备-传输具有发射机超时的数据包信息的方法"这一主题涉及到的是如何有效地管理和处理在数据传输过程中可能出现的发射机超时问题,这对于确保网络的稳定性和可靠性至关重要。下面将详细阐述相关知识点。 一、...
### JS之Session超时提示代码解析 #### 一、引言 在Web开发中,Session是一种常见的用户会话管理机制,用于跟踪用户的交互状态。但Session具有生命周期限制,一旦超时,用户就需要重新登录。本篇文章将深入分析一个...
`VTIME`以十分之一秒为单位设置读操作超时,而`VMIN`设置至少需要读取的字符数,当达到该数目或超时后,读操作返回。 5. **读写操作**: - 使用`read()`和`write()`函数进行串口数据的读写。设置超时后,`read()`...
通过`curl_multi_perform`可以并行执行这些请求,同时利用`curl_easy_setopt`设置超时参数,如`CURLOPT_TIMEOUT`来指定单个请求的超时时间。 压缩包中的`paw-master`可能是一个开源项目,它可能包含了实现上述功能...
5. **性能优化**:基于测试结果,不断优化应用代码,减少响应时间,从而降低对超时时间的依赖。 在实际应用中,电视应用测试装置可能是一个集成硬件和软件的系统,包括自动化测试工具、性能监控模块和策略决策引擎...
- 如何处理网络请求的错误,如超时、无网络连接等? - 谈谈对Android的权限管理,特别是针对Android 6.0及以上版本的变化。 5. **数据存储** - Android中有哪些数据存储方式?比如Shared Preferences、SQLite、...
QQ登陆超时怎么办?.docx
java超时取消正则表达式匹配方法,代码超时处理,设置代码执行时间,超棒的工具类 lambda,Callable,ExecutorService,超过执行5秒退出
行业资料-交通装置-一种停车超时自动熄火器.zip
OpenFeign 使用两个超时参数:connectTimeout 连接超时 和 readTimeout 请求处理超时。以服务A 调用 服务B为例:连接超时时间 (connect-timeout):是指服务A去请求服务B的网络连接时间。读取超时时间/请求处理超时...
本文将详细探讨一种有效的防止ASP超时的方法,并通过示例代码帮助读者理解其实现原理。 #### 防止ASP超时的基本思路 ASP程序默认会在一定时间内没有活动后自动关闭用户的会话(Session),这主要是为了提高服务器...
标题中的“序列号生成buge修改---超时问题,999溢出异常”提示我们,这个话题主要涉及软件开发中的序列号生成机制,以及在处理过程中遇到的问题。序列号通常用于唯一标识产品、用户或者操作,而在生成过程中可能会...