- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java编写超时工具类实例讲解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我们在开发过程中,在进行时间操作时,如果在规定的时间内完成处理的话,有可能会回到正确的结果。否则,就会被视为超时任务。此时,我们不再等待(不再执行)的时间操作,直接向调用者传达这个任务需要时间,被取消了.
java已经为我们提供了解决办法。jdk1.5带来的并发库Future类可以满足这一需求。Future类中重要的方法有get()和cancel()。get()获取数据对象,如果数据没有加载,则在获取数据之前堵塞,cancel()取消数据加载。另一个get(timeout)操作表明,如果timeout时间内没有得到,就会失败回来,不会堵塞.
利用泛型和函数式接口编写一个工具类,可以让超时处理更方便,而不用到处写代码.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
/**
* TimeoutUtil <br>
*
* @author lys
* @date 2021/2/25
*/
@Slf4j
@Component
@NoArgsConstructor
public
class
TimeoutUtil {
private
ExecutorService executorService;
public
TimeoutUtil(ExecutorService executorService) {
this
.executorService = executorService;
}
/**
* 有超时限制的方法
*
* @param bizSupplier 业务函数
* @param timeout 超时时间,ms
* @return 返回值
*/
public
<R> Result<R> doWithTimeLimit(Supplier<R> bizSupplier,
int
timeout) {
return
doWithTimeLimit(bizSupplier,
null
, timeout);
}
/**
* 有超时限制的方法
*
* @param bizSupplier 业务函数
* @param defaultResult 默认值
* @param timeout 超时时间,ms
* @return 返回值
*/
public
<R> Result<R> doWithTimeLimit(Supplier<R> bizSupplier, R defaultResult,
int
timeout) {
R result;
String errMsg =
"Null value"
;
FutureTask<R> futureTask =
new
FutureTask<>(bizSupplier::get);
executorService.execute(futureTask);
try
{
result = futureTask.get(timeout, TimeUnit.MILLISECONDS);
}
catch
(InterruptedException | ExecutionException | TimeoutException e) {
errMsg = String.format(
"doWithTimeLimit执行超过%d毫秒,强制结束"
, timeout);
log.error(errMsg, e);
futureTask.cancel(
true
);
result = defaultResult;
}
return
of(result, errMsg);
}
/**
* 随机耗时的测试方法
*/
private
String randomSpentTime() {
Random random =
new
Random();
int
time = (random.nextInt(
10
) +
1
) *
1000
;
log.info(
"预计randomSpentTime方法执行将耗时: "
+ time +
"毫秒"
);
try
{
Thread.sleep(time);
}
catch
(Exception e) {
}
return
"randomSpentTime --> "
+ time;
}
public
static
void
main(String[] args)
throws
Exception {
ExecutorService executorService =
new
ThreadPoolExecutor(
1
,
1
,
0L, TimeUnit.MILLISECONDS,
new
LinkedBlockingQueue<Runnable>(),
runnable -> {
Thread thread =
new
Thread(runnable);
// 以守护线程方式启动
thread.setDaemon(
true
);
return
thread;
});
TimeoutUtil timeoutUtil =
new
TimeoutUtil(executorService);
for
(
int
i =
1
; i <=
10
; i++) {
log.info(
"\n=============第{}次超时测试============="
, i);
Thread.sleep(
6000
);
long
start = System.currentTimeMillis();
String result = timeoutUtil.doWithTimeLimit(() -> timeoutUtil.randomSpentTime(),
5000
).getOrElse(
"默认"
);
log.info(
"doWithTimeLimit方法实际耗时{}毫秒,结果:{}"
, System.currentTimeMillis() - start, result);
}
}
}
|
实例知识点扩展:
属性校验工具类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/**
* 校验对象中的属性。如果属性为null,抛异常。如果属性为字符串(空串或空格),抛异常。
* @author mex
* @date 2019年4月18日
* @param e 对象
* @param fieldNames 属性名称数组
* @return void
* @throws Exception
*/
public
static
<E>
void
validateAttr(E e, String[] fieldNames)
throws
Exception {
if
(
null
== e) {
throw
new
Exception(
"请求对象为空"
);
}
if
(
null
== fieldNames) {
return
;
}
for
(
int
i =
0
; i < fieldNames.length; i++) {
String fieldName = fieldNames[i];
Field field = e.getClass().getDeclaredField(fieldName);
String typeName = field.getGenericType().getTypeName();
field.setAccessible(Boolean.TRUE);
Object fieldValue = field.get(e);
// 判断该属性为null的情况
if
(
null
== fieldValue) {
throw
new
Exception(
"请求字段:"
+ fieldName +
"不能为空"
);
}
// 如果该属性为字符串,判断其为空或空格的情况
if
(
"java.lang.String"
.equals(typeName)) {
if
(StringUtils.isBlank((String)fieldValue)) {
throw
new
Exception(
"请求字段:"
+ fieldName +
"不能为空"
);
}
}
}
}
|
到此这篇关于Java编写超时工具类实例讲解的文章就介绍到这了,更多相关Java编写超时工具类内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.py.cn/java/jichu/27134.html 。
最后此篇关于Java编写超时工具类实例讲解的文章就讲到这里了,如果你想了解更多关于Java编写超时工具类实例讲解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
wait() 和 wait(timeout) 之间有什么区别。无论如何 wait() 需要等待通知调用,但为什么我们有 wait(timeout)? 那么 sleep(timeout) 和 wait(
如何向以下脚本添加超时?我希望它将文本显示为“超时”。 var bustcachevar = 1 //bust potential caching of external pages after in
我正在使用 Firebase once() 方法来检索 React Native 移动应用中的值。问题是,如果手机离线,once() 永远不会返回。文档说 ref.off() 方法应该取消回调,但这似
我在一个表中有一个大型数据集(超过 200 万行,每行超过 100 列),存储在 cassandra 中,几个月前(也许是 2 个月?)我能够执行一个简单的命令来跟踪该表中的记录数量: SELECT
我使用 jquery 开发移动应用程序,下面是我的代码,当我向包含的页面添加 5 或 6 行时,一切正常。但如果我添加多行显示错误消息:Javascript 执行超时。 function succes
我正在使用一个 javascript 确认,它将在 15 分钟后重复调用。如果用户未选择确认框中的任何选项我会在等待 1 分钟后重定向他。如何实现这一目标?我的代码是这样的 var timeo
每次我在沙箱环境中运行这段代码时,我都会超时并最终崩溃。我已经通过多个 IDE 运行它,但仍然找不到任何语法错误。如果有人看到了我没有看到的东西,我将非常感谢您的意见。 //assign variab
更新联系人后我会显示一条消息,1500 毫秒后我会转到另一个页面。我是这样做的: onSubmit() { if (this.form.valid) {
从昨天开始,我拼命尝试使用最新版本的 PHPMailer 运行一个非常简单的电子邮件脚本。 最荒谬的是,同一个脚本在两台服务器上不起作用,但在另一台服务器上却起作用。 这是我的尝试(来自 PHPMai
我已阅读以下 2 篇文章并尝试实现相同的文章。 我的代码是这样的,超时发生在这里 HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
我正在尝试连接到 wsdl 服务, 但收到此错误: wsdl 错误:获取 http://api.didww.com/api/?wsdl - HTTP 错误: header 的套接字读取超时 本地没有问
我在使用 Ansible 的 CentOs7 实例上从 Artifactory 下载 jar 文件时遇到问题。这是我第一次在 Linux 实例上这样做。 我在每个 Windows 实例上都使用了 wi
在过去的两天里,我一直在寻找原因,我在互联网上和堆栈上尝试了很多解决方案。 我有一个带有 ubuntu 16.04 和 apache2 的专用 VM -> 服务器版本:Apache/2.4.18 (U
我正处于构建 PHP 应用程序的早期阶段,其中一部分涉及使用 file_get_contents()从远程服务器获取大文件并将它们传输给用户。例如,要获取的目标文件是 200 mB。 如果下载到服务器
我正在尝试连接到本地网络内的路由器。到目前为止,我已经使用了 TcpClient。 检查我的代码: public static void RouterConnect() {
我正在尝试构建一段代码来搜索使用 Mechanize 和 Ruby 超时的页面。我的测试台包括一个专门写入超时的页面,以及 3 个正常运行的页面。这是代码: urls = ['http://examp
我是 python 的新手,也是语义网查询领域的新手。我正在使用 SPARQLWrapper 库查询 dbpedia,我搜索了库文档但未能找到从 sparqlWrapper 触发到 dbpedia 的
我正在从 GenServer 中的句柄信息功能调用 elixir genserver 以添加电话号码获取表单客户端。但是一旦调用了handle_call,所有者进程就会崩溃[超时]。请帮忙。 全局创建
假设我的 WCF 服务中有以下执行链: ServiceMethod 调用并等待 Method1,然后调用并等待 Method2,后者调用并等待 Method3。最后 ServiceMethod 在返回
目前我正在开发一个从远程服务器发送和接收文件的应用程序。为了进行网络操作,我正在使用 QNetworkAccessManager。 要上传文件,我使用 QNetworkAccessManager::p
我是一名优秀的程序员,十分优秀!