Разбирался в Java.lang.Process и написал 2 программы:
эта
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("C:\\Users\\User\\Desktop\\test\\output.txt", true);
writer.write("Init message");
for (int i = 0; i < 100000; i++) {
System.out.println(i);
}
writer.close();
}
и запускашка
Process p1 = Runtime.getRuntime()
.exec("java -classpath C:\\Users\\User\\Desktop\\test Main");
p1.waitFor();
System.out.println("finished");
Суть проблемы в том, что если я запускаю программу напрямую, тогда она завершает роботу нормально и выводит в файл все. Если запускаю через вторую программу, то она доходит до 99990 прохода(смотрю по выводу в файл) и зависает, ибо, там есть waitFor(). Почему так и можно ли это исправить?
Заранее спасибо за ответы.
Из JavaDoc для класса Process
By default, the created subprocess does not have its own terminal or console. All its standard I/O (i.e. stdin, stdout, stderr) operations will be redirected to the parent process, where they can be accessed via the streams obtained using the methods getOutputStream(), getInputStream(), and getErrorStream(). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, or even deadlock.
Иными словами, когда создаёшь подпроцесс, ты отвечаешь за вычитывание его output'а или он может повиснуть.
В Яве можно настроить автоматическое вычитывание (через редирект в родительскую консоль) https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html#redirect-input
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости