首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用FutureTask处理超时?

如何使用FutureTask处理超时?
EN

Stack Overflow用户
提问于 2013-01-03 21:04:51
回答 1查看 3.2K关注 0票数 2

我有一个令人沮丧的问题:我试图查看TimeoutException是否在下面的代码中抛出,但这永远不会发生。它总是打印当前时间5次,然后结束。

代码语言:javascript
复制
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来处理超时?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-03 21:10:41

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

更新:

如果你在java中线程化方面需要帮助,在oracle文档中有一个很棒的tutorial

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14139534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档