2013-01-03 5 views
2

나는이 초조한 문제가 있습니다 : TimeoutException이 코드 아래에 던져 지는지 확인하려고 시도하고 있지만 그럴 수는 없습니다. 항상 현재 시간을 5 번 인쇄하고 완료합니다. (이 for 루프를 사용하여 5 회 수행되는 것처럼) call() 방법은 적어도 5 초 정도 걸린다 그래서 Thread.sleep(1000) 사용하고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(); 
     } 
    } 
} 

. 시간 초과 값을 1 초로 설정하여 get() 메서드로 호출합니다.

하지만 왜 TimeoutException이 발생하지 않습니까?

How do I get FutureTask to return after TimeoutException?

의 가능한 중복 될하지만 정말 실망으로 사람을 도울 수 있다면 appriciate 수 있습니다. 아니면 FutureTask를 사용하여 타임 아웃을 처리하는 방법을 이해하지 못 했습니까?

답변

6

별도의 스레드에서 FutureTask를 실행해야합니다 (예 : 실행 프로그램 사용). 현재 동일한 스레드에서 실행 중이므로 run()이 완료 될 때까지 get() 호출이 발생하지 않습니다.

UPDATE : 당신이 자바 스레딩 도움이 필요한 경우

, 오라클 문서에서 환상적인 tutorial있다.

+0

실행 파일을 사용하여 문제를 해결하는 방법을 안내해 줄 수 있습니까? 죄송하지만, java.util.concurrent 패키지가 처음입니다. – ParagJ

+0

@ParagJ - 업데이트 된 답변 – jtahlborn

+1

감사합니다. 집행자 (Executor)를 사용하여 실행했고 매우 효과적이었습니다. 고맙습니다. – ParagJ

관련 문제