我想,下面的内容将永远等待着。如何指定超时?
await(new Job<Long>() {
@Override
public Long doJobWithResult() throws Exception {
...
}
}.now());
最佳答案
实现杀死线程的超时实际上是一件相当困难的事情,因为您需要使用 Thread.stop() 或其他可怕的东西,当它死亡时可能无法清理。更好的方法是在长时间作业中设置超时标志,使其停止处理并更快返回。或者,您可以让长时间的工作继续进行,并在超时时做出响应。
这是一个可以满足您要求的测试用例:
public static void waitWithTimeout() {
Promise<String> task1 = new jobs.DoSomething(100).now();
Promise<String> task2 = new jobs.DoSomething(2000).now();
Either<List<String>,Timeout> r = await(Promise.waitEither(Promise.waitAll(task1, task2), Timeout(300)));
for(Timeout t : r._2) {
StringBuilder result = new StringBuilder();
if(task1.isDone()) {
result.append(" + Task1 -> " + task1.getOrNull());
}
if(task2.isDone()) {
result.append(" + Task2 -> " + task2.getOrNull());
}
renderText("Timeout! Partial result is " + result);
}
renderText("Fail!");
}
关于playframework - 如何等待一个超时的 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506979/