如何使用FutureTask处理超时?

Par*_*agJ 2 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();
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

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

但为什么不抛出TimeoutException呢?

这可能是一个可能的副本如何在TimeoutException之后让FutureTask返回?

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

jta*_*orn 6

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

更新:

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