gpt4 book ai didi

java - 如何使用 FutureTask 处理超时?

转载 作者:行者123 更新时间:2023-11-30 05:50:24 26 4
gpt4 key购买 nike

我遇到了这个令人沮丧的问题:我试图查看下面的代码中是否抛出 TimeoutException,但这种情况从未发生过。它总是打印当前时间 5 次并完成。

class MyTask1 implements Callable<Void> {  

public Void call() throws Exception {
for (int i=0; i < 5; i++) {
System.out.println(new java.util.Date());
Thread.sleep(1000);
}
return null;
}
}

public class Timeout {
public static void main(String[] args) throws Exception {
FutureTask<Void> futureTask = new FutureTask<Void>(new MyTask1());
futureTask.run();
try {
futureTask.get(1000, TimeUnit.MILLISECONDS); // Check if FutureTask completed in the given time
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
futureTask.cancel(true);
e.printStackTrace();
}
}
}

我正在使用 Thread.sleep(1000),因此 call() 方法至少需要 5 秒(因为使用 for 循环完成了 5 次)。我通过将超时值设置为 1 秒来调用 get() 方法。

但是为什么它不抛出TimeoutException呢?

这可能是 How do I get FutureTask to return after TimeoutException? 的可能重复项

但是,如果有人能提供帮助,我会很感激,因为这真的很令人沮丧。还是我不明白如何使用 FutureTask 来处理超时?

最佳答案

您需要在单独的线程上运行 FutureTask(例如使用 Executor)。您目前正在同一个线程中运行它,因此 get() 调用不会发生,直到 run() 已经完成。

更新:

如果您需要有关 Java 线程的帮助,可以使用很棒的 tutorial在 Oracle 文档中。

关于java - 如何使用 FutureTask 处理超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com