如何使用FutureTask处理超时?

时间:2013-01-03 13:04:51

标签: java

我遇到了这个令人沮丧的问题:我正在尝试查看下面的代码是否抛出了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来处理超时?

1 个答案:

答案 0 :(得分:6)

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

更新:

如果您需要java中的线程帮助,oracle文档中有一个很棒的tutorial