Извлечение кода завершения процесса в случае ThreadInterrupted

Я только что создал процесс с помощью вызова exec() и теперь использую его метод .waitFor(). Мне нужно поймать InterruptedException, но я не уверен, что мне следует поместить в блок кода перехвата. Я хотел бы получить код выхода, но не буду, если текущий поток будет прерван. Что я должен сделать, чтобы получить код выхода из процесса, если поток прерван?

Пример:

import java.io.IOException;


public class Exectest {
public static void main(String args[]){
      int exitval;

      try {
        Process p = Runtime.getRuntime().exec("ls -la ~/");
        exitval = p.waitFor();
        System.out.println(exitval);
    } catch (IOException e) {
        //Call failed, notify user.
    } catch (InterruptedException e) {
        //waitFor() didn't complete. I still want to get the exit val. 
        e.printStackTrace();
    }

}
}

person fthinker    schedule 28.05.2011    source источник


Ответы (1)


На вашем месте я бы поместил это в блок catch:

p.destroy();
exitval = p.exitValue();

Поскольку ваш поток был прерван, что-то пошло не так. destroy() принудительно завершит процесс, а затем exitValue() даст вам значение выхода (которое должно быть кодом ошибки, поскольку он был завершен).

Подробнее http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

person stevevls    schedule 28.05.2011
comment
Обязательно ли InterruptedException сигнализирует об ошибке? Я думал, что это может быть что-то, что просто происходит по целому ряду причин. - person fthinker; 28.05.2011
comment
Нет... это не обязательно ошибка. Это просто означает, что текущий поток был прерван по какой-либо причине. Программист сам решает, что с ним делать. Однако, как правило, хорошей идеей будет прекратить то, что вы делаете, и вернуться. Подробнее здесь: download.oracle.com/javase/tutorial/essential/concurrency / - person stevevls; 28.05.2011
comment
Я думаю, что этот ответ неверен. Получение InterruptedException означает, что текущий поток был прерван. Он ничего не говорит вам о статусе процесса. См. ibm.com/developerworks/java/library/j-jtp05236. /index.html - person ditkin; 28.05.2011
comment
Я не говорил, что в процессе что-то пошло не так. Скорее, как правило, лучше очистить и вернуться домой, когда есть InterruptedException и как это сделать с объектом Process. - person stevevls; 28.05.2011
comment
Хорошо, но будет ли вообще когда-нибудь генерироваться InterruptedException? Из того, что я читал, это выглядит как событие, которое полностью зависит от программиста. когда вызывается Thread.interrupt(). - person fthinker; 29.05.2011
comment
Честно говоря, наверное, нет. Но всякий раз, когда вы имеете дело с потоками, лучше быть готовым к прерываниям, потому что они могут поступать из разных источников. Здесь программа достаточно проста, чтобы вы могли просто окружить свой p.waitFor() циклом while и игнорировать любое всплывающее InterruptedException. В более сложной программе это было бы менее разумно. Это один из тех случаев, когда вы используете свое лучшее суждение. ;) - person stevevls; 29.05.2011
comment
Хороший! Я пытался выяснить различные контексты, в которых может возникнуть это исключение. С одной стороны, похоже, что если я сам написал код, то я могу быть уверен, что поток будет прерван (в конце концов, я напишу thread. Interrupt()!) Но если мой код будет использоваться другими (например, я пишу библиотеку), тогда кто-то другой может вызвать thread.Interrupt() в своем коде, и мне придется учитывать этот случай. Так что я думаю, что в целом, если вы полностью владеете кодом, вам не нужно иметь дело с этой ошибкой, иначе заложите в бюджет возможность того, что другие могут сгенерировать прерывание! - person fthinker; 29.05.2011