2

我有这个令人沮丧的问题:我正在尝试查看下面的代码中是否引发了 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 次)。我get()通过将超时值设置为 1 秒来调用方法。

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

这可能是如何让 FutureTask 在 TimeoutException 之后返回?

但是,如果有人可以提供帮助,那真的很令人沮丧。或者我不明白如何使用 FutureTask 来处理超时?

4

1 回答 1

6

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

更新:

如果您需要有关 Java 线程的帮助,请参阅 oracle 文档中的精彩教程

于 2013-01-03T13:10:40.980 回答