2015-01-28 6 views
0

자바에서 외부 프로그램을 호출 할 때 시간 초과로 문제가 발생합니다. 아래 코드가 있습니다. 이 프로그램은 java를 통해 notepad.exe를 열려고 시도하고 5 초 후에 종료됩니다. 내가 직면하고있는 문제는 그것의 메모장을 종료 있지만 자바 프로세스는 여전히 활성 (이클립스가 종료되지 않습니다) 남아있다. 전문가가 도와주세요!제한 시간이있는 java에서 외부 프로그램 호출

public class ExecTest { 

public static void main(String[] args) { 
    System.out.println("STARTING"); 
    new ExecTest().callNotepad(); 
    System.out.println("ENDING"); 
} 

public ExecTest() { 
} 

private void callNotepad() { 
    ProcessBuilder pb = new ProcessBuilder("notepad.exe"); 
    pb.redirectErrorStream(true); 
    try { 
     Timer t = new Timer(); 
     pb.redirectErrorStream(true); 
     Process p = pb.start(); 
     TimerTask killer = new TimeoutProcessKiller(p); 
     t.schedule(killer, 5000); 
     try { 
      InputStream is = p.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line = ""; 
      while ((line = br.readLine()) != null) { 
       System.out.println(line + "\n"); 
      } 
      p.waitFor(); 
      System.out.println("HERE!"); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      System.out.println("Cancelling timer"); 
      killer.cancel(); 
      System.out.println("Cancelled timer"); 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 

class TimeoutProcessKiller extends TimerTask { 
private Process p; 
public TimeoutProcessKiller(Process p) { 
    this.p = p; 
} 

@Override 
public void run() { 
    System.out.println("Destroying thread p=" + p); 
    p.destroy(); 
    System.out.println("Destroyed thread p=" + p); 
} 

} 

답변

2

당신은 TimerTask를 killer 대신 타이머 t을 취소했습니다.
killer.cancel();t.cancel()

+0

Joachim에게 감사하십시오. 그게 효과가! – gpothan

관련 문제