2015-04-26 7 views
0

Я хочу иметь механизм, при котором ожидаемый процесс не должен запускаться больше определенного времени. По истечении определенного времени должно отображаться состояние процесса или нет, и процесс больше не должен запускаться.Процесс Killing после определенного времени (Java)

Для этого я попытался выполнить два класса: Execute и Check, Execute Метод запуска объекта будет выполнять процесс. Check объект будет спать в течение определенного времени, после чего он проверяет, все еще запущен объект Execute. Если он запускает Check, объект должен убить этот поток и напечатать «да». Else, Check объект должен печатать «нет».

class Execute extends Thread{ 
     public void run(){ 
      //Execute process 
     } 
     public static void main(String[] args){ 
      Execute ex = new Execute(); 
      ex.start(); 
      Check ch = new Check(ex); 
      ch.start(); 
     } 
    } 
    class Check extends Thread{ 
     Execute ex; 
     Check(Execute ex){ 
      this.ex = ex; 
     } 
     public void run(){ 
      try{Thread.sleep(5000);} //specific time given is 5 seconds. 
      catch(Exception e){System.out.println(e);} 
      if(ex.isAlive()){ 
      System.out.println("yes"); 
      //kill the thread ex. 
      } 
      else System.out.println("no"); 
     } 
    } 

Мои вопросы:

  • Как я могу убить ex нить?
  • Каков наилучший способ реализации этого механизма?
+0

Возможный дубликат [этот вопрос] (http://stackoverflow.com/questions/808276/how-to-add-a-timeout-value-when -Использование-Javas-среда-Exec). –

+0

Читайте о ['Process'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html), который имеет метод' destroy() '. – Mordechai

ответ

0

Существует нет 100% безопасного способа сделать это на Java.

рекомендуют подход будет прерывать выполнение резьбы

if(ex.isAlive()){ 
     System.out.println("yes"); 
     //kill the thread ex. 
     ex.interrupt() 
} 

, но для этого, чтобы работать внутри вашей логики метода Execute Run() вам нужно проверить, если interrupted() возвращает истину, и если да, то остановить вычисления (например, если ваш метод выполнения что-то делает в цикле, первые операторы внутри цикла могут выполнить эту проверку. Прерывание также разрушит все «блокирующие» операции, такие как wait(), sleep(), операции ввода-вывода, поэтому они влияют на оба ваш «код» и назовем их «системными» методами (вот почему, например, сбрасывание сна InterruptedException).

Тем не менее вам необходимо контролировать код метода run(), чтобы добавить необходимые проверки и остановить его выполнение.

Хардкор путь останавливая поток зовет

ex.stop() 

, как вы можете видеть в JavaDoc она устарела и не должна обычно используется, поскольку это может вызвать проблемы (прочитать документ). Но это единственный способ остановить поток, который выдает код, который вы не контролируете.

Мой подход был бы первым, чтобы прервать, дождаться, чтобы убедиться, что это сработало, и если не принудительно остановить поток.

if(ex.isAlive()){ 
     System.out.println("yes"); 
     //kill the thread ex. 
     ex.interrupt(); 
     ex.join(100); //give the ex thread chance to stop in a clean way 
     if (ex.isAlive()) { 
      ex.stop(); 
     } 
} 
0

Сначала некоторая сопутствующая информация, я наткнулся на вопрос, чтобы иметь тайм-аут во время выполнения команды, так как программа, которую я пытался выполнить никогда бы не напечатать любые отлаживать или информацию об ошибках упаковывают ошибки и просто держать на повторе внутренне само по себе приводит к тому, что процесс застрял, потому что при его повторной попытке никогда не возникало ошибка или выходной поток.

Таким образом, после process.exec() или process.start(),

Было бы застрял навсегда на этой линии,

BufferedReader input = new BufferedReader(newInputStreamReader(process.getInputStream()));

В соответствии с Java 1.8 с public boolean waitFor(long timeout,TimeUnit unit) методом он должен иметь «в идеале» тайм-аут после того, как указано тайм-аут, но в моем случае по какой-то причине он никогда не был рассчитан на время, потому что я запускал приложение в качестве службы Windows (я проверял права пользователя и все, что было в учетной записи, но это не помогло).

Итак, я попытался реализовать его с помощью логики ниже, где мы будем проверять входной поток с input.ready() и флагом тайм-аута. Это простое решение работало как шарм по сравнению со всеми остальными, которые существовали.

Смотрите код ниже:

https://stackoverflow.com/a/33265110/1212036

Смежные вопросы