Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание при вызове waitFor() / 18 сообщений из 18, страница 1 из 1
01.02.2012, 11:06:50
    #37641395
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Делаю:

Код: java
1.
2.
Process p = Runtime.getRuntime().exec("...");
p.waitFor();



и после этого до прихода нового Моисея можно идти курить, ну или пока свет не вырубят
Прочитал, но нихрена не понял, статейку
Там констатируют факт ошибки но никаких советов как этого избежать не дают - нахрен статьи с констатацией и так извесного всем факта?

Как побороть проблему?
...
Рейтинг: 0 / 0
01.02.2012, 11:11:35
    #37641408
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
spТам констатируют факт ошибки но никаких советов как этого избежать не дают - нахрен статьи с констатацией и так извесного всем факта?

Попробуй до конца дочитать
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=3
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

Если Java 7, то там уже есть готовые redirect методы.
...
Рейтинг: 0 / 0
01.02.2012, 11:13:04
    #37641413
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Вот здесь ещё первые 7-8 тем почитайте
http://www.sql.ru/forum/actualsearch.aspx?search=ProcessBuilder&sin=0&bid=38&a=&ma=0&dt=-1&s=1&so=1
...
Рейтинг: 0 / 0
01.02.2012, 11:44:05
    #37641486
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Blazkowicz,

самое смешное, что я не написал - у меня после Runtime.getRuntime().exec(...)
читается выходной буфер, но моя ошибка состояла в том что я вызывал break, а не вычитал весь буфер до конца!

Код: java
1.
2.
3.
4.
5.
6.
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null; 
while ((line = in.readLine()) != null) {
  ....
  break; //<---ошибка - никогда так не делайте!
}



но, кто бы знал что его надо вычитать весь да еще и в случае ошибок необходимо вычитывать весь ErrorStream!?
Воистину - если пишешь простой интерфейс - обеспечь ему простую и прозрачную работу!
Тут разработчики сделали засаду для тех кто не знает сложностей этого метода!
...
Рейтинг: 0 / 0
01.02.2012, 12:02:01
    #37641544
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
только вот вопрос остался - если мне не нужно знать результат выполнения Runtime.getRuntime().exec и я не вычитывал буферы - что будет с системой
(
- команда выполняется, но а что с явой?
- что она себе там внутри думать будет?
- не будет ли там собирать у себя всякий мусор?
- и нужно ли в любом случае вычищать эти буферы или буфера
)?
...
Рейтинг: 0 / 0
01.02.2012, 12:35:56
    #37641622
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
sp- команда выполняется, но а что с явой?

Команда выпонлняется, только до тех пор, пока ей не нужны IO потоки процесса. Если они ей не нужны вообще. То и проблем не будет. Если она начнет вывод, то её поток заблокируется на на операции вывода и будет ждать, пока Java процесс этот вывод не вычитает. Можно запускать команды через shell так чтобы они порождали дополнительный процесс. Например start cmd. Тогда сам доченрний процесс сразу же завершается, а процесс команды является внучатым и работает спокойно.
Но waitFor() при этом смысл теряет.

sp- что она себе там внутри думать будет?

Java? Ничего не будет думать. Она не может думать ни внутри, ни снаружи.

sp- не будет ли там собирать у себя всякий мусор?

Сборка мусора работает в параллельных потоках, ваши потоки на неё не особо влияют.

sp- и нужно ли в любом случае вычищать эти буферы или буфера
)?
Reader это тот же Stream, только для текстового потока. Ничего там вычищать не нужно. Можно вызвать close() при желании. Но есть ли смысл, не уверен.
...
Рейтинг: 0 / 0
01.02.2012, 12:55:28
    #37641672
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Blazkowicz,

так сложно ответили, что я не понЯл или не пОнял :)
если я буду выполнять excec и затем плевать на результат - что будет? процессы так и зависнут в памяти или все будет нормально?
...
Рейтинг: 0 / 0
01.02.2012, 12:58:29
    #37641683
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
spесли я буду выполнять excec и затем плевать на результат - что будет? процессы так и зависнут в памяти или все будет нормально?
Зависит от процесса.
...
Рейтинг: 0 / 0
01.02.2012, 13:01:42
    #37641690
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Blazkowiczspесли я буду выполнять excec и затем плевать на результат - что будет? процессы так и зависнут в памяти или все будет нормально?
Зависит от процесса.

а что от него может зависеть??
...
Рейтинг: 0 / 0
01.02.2012, 13:39:16
    #37641801
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
spа что от него может зависеть??
Если он пишет в свой out, то он блокируется ("зависает"), потому что Java не вычитывает оттуда данные.
Если он ничего никуда не пишет, то спокойно отработает без зависания.
...
Рейтинг: 0 / 0
01.02.2012, 14:58:51
    #37641996
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Blazkowiczspа что от него может зависеть??
Если он пишет в свой out, то он блокируется ("зависает"), потому что Java не вычитывает оттуда данные.
Если он ничего никуда не пишет, то спокойно отработает без зависания.

т.е. иными словами - если процесс выводит что-то в stdout - нужно обязательно вычитывать ErrorStream и InputStream!?
...
Рейтинг: 0 / 0
01.02.2012, 15:00:30
    #37642001
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
spт.е. иными словами - если процесс выводит что-то в stdout - нужно обязательно вычитывать ErrorStream и InputStream!?Не в этом дело. Просто если процесс пишет МНОГО в какой-либо из этих потоков, то конкретная ОСь может отмочить какую-нибудь хрень, например - перестать выполнять этот процесс до освобождения места в потоке. Поэтому, что бы обезопасить себя от таких кренделей, оба выходных потока надо вычитывать.
...
Рейтинг: 0 / 0
01.02.2012, 15:08:44
    #37642024
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
svenomspт.е. иными словами - если процесс выводит что-то в stdout - нужно обязательно вычитывать ErrorStream и InputStream!?Не в этом дело. Просто если процесс пишет МНОГО в какой-либо из этих потоков, то конкретная ОСь может отмочить какую-нибудь хрень, например - перестать выполнять этот процесс до освобождения места в потоке. Поэтому, что бы обезопасить себя от таких кренделей, оба выходных потока надо вычитывать.

перефразирую - желательно всегда вычитывать!
...
Рейтинг: 0 / 0
01.02.2012, 15:19:03
    #37642054
sp
sp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
BlazkowiczЕсли Java 7, то там уже есть готовые redirect методы.

а что там в 7ке?
...
Рейтинг: 0 / 0
01.02.2012, 15:20:22
    #37642055
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
...
Рейтинг: 0 / 0
01.02.2012, 15:27:56
    #37642075
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Blazkowicz http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html Да ProcessBuilder и до семерки редиректить умел :)
...
Рейтинг: 0 / 0
01.02.2012, 15:29:34
    #37642079
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
svenomДа ProcessBuilder и до семерки редиректить умел :)
Даже, не знаю что ответить, чтобы не нагрубить:

rtfm redirectInput
...
Since:
1.7
...
Рейтинг: 0 / 0
01.02.2012, 16:55:37
    #37642280
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависание при вызове waitFor()
Blazkowicz ,
Ааа, вы про это. Я то думал речь идет про редирект errorStream в outputStream.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Зависание при вызове waitFor() / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]