2013-01-03 39 views
2

我有這個令人沮喪的問題:我想查看是否在下面的代碼中引發TimeoutException,但是這不會發生。它總是打印當前時間5次並完成。如何使用FutureTask處理超時?

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來處理超時?

回答

6

您需要在單獨的線程上運行FutureTask(使用例如Executor)。您目前正在同一個線程中運行它,因此get()調用不會發生,直到run()已完成。

UPDATE:

如果您需要在Java線程幫助,有在Oracle文檔一個夢幻般的tutorial

+0

你能指導我一個例子如何解決這個使用Executor?對不起,但我是java.util.concurrent包的新手。 – ParagJ

+0

@ParagJ - 更新回答 – jtahlborn

+1

非常感謝您的信息。我用Executor運行它,它運行得非常好。謝謝。 – ParagJ