Класс Process
public abstract class Process extends Object
Process предоставляет управление локальными процессами, запущенными с помощью ProcessBuilder.start и Runtime.exec. Класс предоставляет методы для выполнения ввода для процесса, вывода в процесс, ожидания завершения процесса, проверки выходного статуса процесса и уничтожения (прерывания) процесса. Методы ProcessBuilder.start() и Runtime.exec создают локальный процесс и возвращают экземпляр подкласса Process, который можно использовать для управления процессом и получения информации о нём. Методы, создающие процессы, могут некорректно работать с особыми процессами на некоторых платформах, такими как процессы оконного менеджера, демон-процессы, Win16/DOS процессы в Microsoft Windows или скрипты оболочки.
По умолчанию создаваемый процесс не имеет собственного терминала или консоли. Все его стандартные операции ввода/вывода (т.е. stdin, stdout, stderr) будут перенаправлены в родительский процесс, где к ним можно получить доступ через потоки, полученные с помощью методов getOutputStream(), getInputStream() и getErrorStream(). Потоки ввода/вывода символов и строк можно записывать и читать с помощью методов outputWriter(), outputWriter(Charset)}, inputReader(), inputReader(Charset), errorReader() и errorReader(Charset). Родительский процесс использует эти потоки для подачи ввода и получения вывода из процесса. Поскольку некоторые платформы предоставляют ограниченный размер буфера для стандартных потоков ввода/вывода, ненадлежащее быстрое написание потока ввода или чтение потока вывода процесса могут привести к блокировке или даже тупиковой ситуации.
Если необходимо, перенаправление ввода/вывода процесса также возможно с помощью методов класса ProcessBuilder.
Процесс не уничтожается, когда больше нет ссылок на объект Process, а продолжает выполняться асинхронно.
Нет требования, чтобы процесс, представленный объектом
Process, выполнялся асинхронно или параллельно процессу Java, владеющему объектом Process.
Начиная с версии 1.5, ProcessBuilder.start() является предпочтительным способом создания Process.
Подклассы Process должны переопределять методы onExit() и toHandle() для предоставления полностью функционального процесса, включая идентификатор процесса (pid), информацию о процессе (info), прямых потомков (children) и потомков прямых потомков (descendants) процесса. Делегирование в подлежащий Process или ProcessHandle обычно является самым простым и эффективным.
- Since:
- 1.0
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Process() |
Конструктор по умолчанию для Process. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
Stream |
children() |
Возвращает моментальный снимок прямых потомков процесса. |
Stream |
descendants() |
Возвращает моментальный снимок потомков процесса. |
abstract void |
destroy() |
Уничтожает процесс. |
Process |
destroyForcibly() |
Принудительно уничтожает процесс. |
final BufferedReader |
errorReader() |
Возвращает BufferedReader, подключенный к стандартному выводу ошибок процесса. |
final BufferedReader |
errorReader |
Возвращает BufferedReader, подключенный к стандартному выводу ошибок этого процесса, используя кодировку. |
abstract int |
exitValue() |
Возвращает значение выхода для процесса. |
abstract InputStream |
getErrorStream() |
Возвращает поток ввода, подключенный к выводу ошибок процесса. |
abstract InputStream |
getInputStream() |
Возвращает поток ввода, подключенный к обычному выводу процесса. |
abstract OutputStream |
getOutputStream() |
Возвращает поток вывода, подключенный к обычному вводу процесса. |
ProcessHandle.Info |
info() |
Возвращает моментальный снимок информации о процессе. |
final BufferedReader |
inputReader() |
Возвращает BufferedReader, подключенный к стандартному выводу процесса. |
final BufferedReader |
inputReader |
Возвращает BufferedReader, подключенный к стандартному выводу этого процесса, используя кодировку. |
boolean |
isAlive() |
Проверяет, жив ли процесс, представленный этим Process. |
CompletableFuture |
onExit() |
Возвращает CompletableFuture<Process> для завершения процесса. |
final BufferedWriter |
outputWriter() |
Возвращает BufferedWriter подключенный к обычному вводу процесса, используя родную кодировку. |
final BufferedWriter |
outputWriter |
Возвращает BufferedWriter подключенный к обычному вводу процесса, используя кодировку. |
long |
pid() |
Возвращает идентификатор родного процесса. |
boolean |
supportsNormalTermination() |
Возвращает true, если реализация destroy() должна нормально завершить процесс, Возвращает false, если реализация destroy принудительно и немедленно завершает процесс. |
ProcessHandle |
toHandle() |
Возвращает ProcessHandle для Process. |
abstract int |
waitFor() |
Принудительно заставляет текущую нить подождать, если необходимо, пока процесс, представленный этим объектом Process, не завершится. |
boolean |
waitFor |
Принудительно заставляет текущую нить подождать, если необходимо, пока процесс, представленный этим объектом Process не завершится, или не истечёт заданное время ожидания. |
Подробное описание конструкторов
Process
public Process()
Подробное описание методов
getOutputStream
public abstract OutputStream getOutputStream()
Если стандартный ввод процесса был перенаправлен с помощью ProcessBuilder.redirectInput, то этот метод вернёт null поток вывода.
- Примечание API:
- При записи в
getOutputStream()и вoutputWriter()илиoutputWriter(Charset), необходимо вызватьBufferedWriter.flushперед записью вOutputStream. - Примечание реализации:
- Для возвращаемого потока вывода рекомендуется буферизация.
- Возвращает:
- поток вывода, подключенный к стандартному вводу процесса
getInputStream
public abstract InputStream getInputStream()
Если стандартный вывод процесса был перенаправлен с помощью ProcessBuilder.redirectOutput, то этот метод вернёт null поток ввода.
В противном случае, если стандартная ошибка процесса была перенаправлена с помощью ProcessBuilder.redirectErrorStream, то поток ввода, возвращаемый этим методом, получит объединённый стандартный вывод и стандартную ошибку процесса.
- Примечание API:
- Используйте
getInputStream()иinputReader()с осторожностью.BufferedReaderможет иметь буферизованный ввод из потока ввода. - Примечание реализации:
- Для возвращаемого потока ввода рекомендуется буферизация.
- Возвращает:
- поток ввода, подключенный к стандартному выводу процесса
getErrorStream
public abstract InputStream getErrorStream()
Если стандартная ошибка процесса была перенаправлена с помощью ProcessBuilder.redirectError или ProcessBuilder.redirectErrorStream, то этот метод вернёт null поток ввода.
- Примечание API:
- Используйте
getErrorStream()иerrorReader()с осторожностью.BufferedReaderможет иметь буферизованный ввод из потока ошибок. - Примечание реализации:
- Для возвращаемого потока ввода рекомендуется буферизация.
- Возвращает:
- поток ввода, подключенный к выводу ошибок процесса
inputReader
public final BufferedReader inputReader()
BufferedReader, подключённый к стандартному выводу процесса. Используется кодировка Charset для чтения символов, строк или потоковых строк со стандартного вывода. Этот метод делегирует вызов inputReader(Charset) с использованием кодировки Charset, указанной системной переменной native.encoding. Если native.encoding не является допустимым именем кодировки или не поддерживается, используется Charset.defaultCharset().
- Возвращает:
BufferedReaderс использованиемnative.encoding, если поддерживается, в противном случае используетсяCharset.defaultCharset()- С:
- 17
inputReader
public final BufferedReader inputReader(Charset charset)
BufferedReader, подключённый к стандартному выводу этого процесса с помощью кодировки. BufferedReader может использоваться для чтения символов, строк или потоковых строк стандартного вывода. Символы читаются с помощью InputStreamReader, который считывает и декодирует байты из потока ввода этого процесса getInputStream(). Байты декодируются в символы с помощью charset; некорректные входные данные и последовательности неотображаемых символов заменяются на значение по умолчанию кодировки. BufferedReader считывает и буферизует символы из InputStreamReader.
Первый вызов этого метода создаёт BufferedReader; если он вызывается снова с той же кодировкой, возвращается тот же BufferedReader. Ошибка вызывать этот метод снова с другой кодировкой.
Если стандартный вывод процесса был перенаправлен с помощью ProcessBuilder.redirectOutput, то InputStreamReader будет читать из null потока ввода.
В противном случае, если стандартная ошибка процесса была перенаправлена с помощью ProcessBuilder.redirectErrorStream, то входной поток, возвращаемый этим методом, получит объединённый стандартный вывод и стандартную ошибку процесса.
- Примечание API:
- Использование
getInputStream()иinputReader(Charset)имеет непредсказуемое поведение, поскольку буферизованный читатель считывает данные вперёд из потока ввода.При завершении процесса и отсутствии перенаправления стандартного ввода чтение доступных байтов из базового потока выполняется в лучшем случае и может быть непредсказуемым.
- Параметры:
-
charset-Charsetдля декодирования байтов в символы - Возвращает:
BufferedReaderдля стандартного вывода процесса с использованиемcharset- Исключения:
-
NullPointerException- еслиcharsetnull -
IllegalStateException- если вызывается более одного раза с разными аргументами кодировки - С:
- 17
errorReader
public final BufferedReader errorReader()
BufferedReader, подключённый к стандартной ошибке процесса. Используется кодировка Charset для чтения символов, строк или потоковых строк со стандартной ошибки. Этот метод делегирует вызов errorReader(Charset) с использованием кодировки Charset, указанной системной переменной native.encoding. Если native.encoding не является допустимым именем кодировки или не поддерживается, используется Charset.defaultCharset().
- Возвращает:
BufferedReaderс использованиемnative.encoding, если поддерживается, в противном случае используетсяCharset.defaultCharset()- С:
- 17
errorReader
public final BufferedReader errorReader(Charset charset)
BufferedReader, подключённый к стандартной ошибке этого процесса с использованием кодировки. BufferedReader может использоваться для чтения символов, строк или потоковых строк стандартной ошибки. Символы читаются с помощью InputStreamReader, который считывает и декодирует байты из потока ошибок этого процесса getErrorStream(). Байты декодируются в символы с помощью charset; некорректные входные данные и последовательности неотображаемых символов заменяются на значение по умолчанию кодировки. BufferedReader считывает и буферизует символы из InputStreamReader.
Первый вызов этого метода создаёт BufferedReader; если он вызывается снова с той же кодировкой, возвращается тот же BufferedReader. Ошибка вызывать этот метод снова с другой кодировкой.
Если стандартная ошибка процесса была перенаправлена с помощью ProcessBuilder.redirectError или ProcessBuilder.redirectErrorStream, то InputStreamReader будет читать из null потока ввода.
- Примечание API:
- Использование
getErrorStream()иerrorReader(Charset)имеет непредсказуемое поведение, поскольку буферизованный читатель считывает данные вперёд из потока ошибок.При завершении процесса и отсутствии перенаправления стандартной ошибки чтение доступных байтов из базового потока выполняется в лучшем случае и может быть непредсказуемым.
- Параметры:
-
charset-Charsetдля декодирования байтов в символы - Возвращает:
BufferedReaderдля стандартной ошибки процесса с использованиемcharset- Исключения:
-
NullPointerException- еслиcharsetnull -
IllegalStateException- если вызывается более одного раза с разными аргументами кодировки - С:
- 17
outputWriter
public final BufferedWriter outputWriter()
BufferedWriter , подключенный к стандартному вводу процесса, используя кодировку по умолчанию. Записывает текст в поток символьного вывода, буферизуя символы для эффективной записи отдельных символов, массивов и строк. Этот метод делегирует вызов методу outputWriter(Charset), используя кодировку, указанную в системной переменной native.encoding. Если системная переменная native.encoding не содержит допустимого имени кодировки или кодировка не поддерживается, используется кодировка по умолчанию Charset.defaultCharset().
- Возвращает:
BufferedWriterк стандартному вводу процесса, используя кодировку из системной переменнойnative.encoding- Since:
- 17
outputWriter
public final BufferedWriter outputWriter(Charset charset)
BufferedWriter , подключенный к стандартному вводу процесса, используя заданную кодировку. Записывает текст в поток символьного вывода, буферизуя символы для эффективной записи отдельных символов, массивов и строк. Символы, написанные в потоке, кодируются в байты с помощью OutputStreamWriter, а байты записываются в стандартный ввод процесса, представленного этим объектом Process. Неправильные и неотображаемые последовательности символов заменяются на последовательности по умолчанию для заданной кодировки.
Первый вызов этого метода создаёт объект BufferedWriter. Если метод вызван повторно с тем же параметром charset, возвращается тот же объект BufferedWriter. Ошибка возникает при повторном вызове метода с другим параметром charset.
Если стандартный ввод процесса перенаправлен с помощью ProcessBuilder.redirectInput, то OutputStreamWriter записывает в нулевой поток вывода.
- API Note:
- Класс BufferedWriter записывает символы, массивы символов и строки. Обёртка класса
BufferedWriterс классомPrintWriterобеспечивает эффективную буферизацию и форматирование примитивов и объектов, а также поддержку автоматической записи при достижении конца строки. Вызовите методBufferedWriter.flush()для сброса буферизованного вывода в процесс.При записи как в
getOutputStream(), так и вoutputWriter()илиoutputWriter(Charset), следует вызывать метод BufferedWriter.flush перед записью вOutputStream. - Параметры:
-
charset- кодировка для преобразования символов в байты - Возвращает:
BufferedWriterк стандартному вводу процесса, используя заданнуюcharset- Исключение:
-
NullPointerException- если указаннаяcharsetnull -
IllegalStateException- если вызов производится более одного раза с разными параметрами кодировки - Since:
- 17
waitFor
public abstract int waitFor() throws InterruptedException
Process, не завершится. Если процесс уже завершился, метод возвращает значение немедленно. Если процесс ещё не завершился, вызывающий поток будет заблокирован до завершения процесса.- Возвращает:
- код завершения процесса, представленного этим объектом
Process. По соглашению, значение0указывает на нормальное завершение. - Исключение:
-
InterruptedException- если текущий поток прерывается другим потоком во время ожидания, ожидание завершается, и выбрасывается исключениеInterruptedException.
waitFor
public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException
Process, не завершится или не истечёт заданное время ожидания. Если процесс уже завершился, метод возвращает значение немедленно. Если процесс ещё не завершился и значение таймаута меньше или равно нулю, метод возвращает значение немедленно.
Реализация по умолчанию этого метода опрашивает процесс, чтобы проверить, завершился ли он. Конкретные реализации этого класса настоятельно рекомендуются переопределить этот метод для повышения эффективности.
- Параметры:
-
timeout- максимальное время ожидания -
unit- единица измерения времени для аргументаtimeout - Возвращает:
- код завершения процесса, если процесс завершился;
falseесли время ожидания истекло до завершения процесса. - Исключение:
-
InterruptedException- если текущий поток прерван во время ожидания. -
NullPointerException- если единица измерения времени равна null - Since:
- 1.8
exitValue
public abstract int exitValue()
- Возвращает:
- код завершения процесса, представленного этим объектом
Process. По соглашению, значение0указывает на нормальное завершение. - Исключение:
-
IllegalThreadStateException- если процесс, представленный этим объектомProcess, ещё не завершился
destroy
public abstract void destroy()
Process, зависит от реализации. Принудительное завершение процесса определяется как немедленное завершение, а нормальное завершение позволяет процессу завершиться корректно. Если процесс не активен, никаких действий не предпринимается. Объект CompletableFuture из onExit() завершается, когда процесс завершается.
destroyForcibly
public Process destroyForcibly()
Process, завершается принудительно. Принудительное завершение процесса определяется как немедленное завершение, а нормальное завершение позволяет процессу завершиться корректно. Если процесс не активен, никаких действий не предпринимается. Объект CompletableFuture из onExit() завершается, когда процесс завершается.
Вызов этого метода для объектов Process, возвращаемых методами ProcessBuilder.start() и Runtime.exec(java.lang.String), приводит к принудительному завершению процесса.
- API Note:
- Процесс может не завершиться немедленно. То есть
isAlive()может возвращать true в течение короткого времени после вызоваdestroyForcibly(). Этот метод может быть вызван в цепочке сwaitFor(), если это необходимо. - Implementation Requirements:
- Реализация по умолчанию этого метода вызывает
destroy(), поэтому может не принудительно завершить процесс. - Implementation Note:
- Конкретные реализации этого класса настоятельно рекомендуются переопределить этот метод для корректной реализации.
- Возвращает:
- объект
Process, представляющий принудительно завершенный процесс - Since:
- 1.8
supportsNormalTermination
public boolean supportsNormalTermination()
true , если реализация метода destroy() предполагает нормальное завершение процесса. Возвращает false , если реализация метода destroy предполагает принудительное и немедленное завершение процесса. Вызов этого метода для объектов Process, возвращаемых методами ProcessBuilder.start() и Runtime.exec(java.lang.String), возвращает true или false в зависимости от реализации платформы.
- Implementation Requirements:
- Эта реализация выбрасывает исключение
UnsupportedOperationExceptionи не выполняет никаких других действий. - Возвращает:
-
true, если реализация методаdestroy()предполагает нормальное завершение процесса; иначеdestroy()принудительно завершает процесс - Исключение:
-
UnsupportedOperationException- если реализация процесса не поддерживает данную операцию - Since:
- 9
isAlive
public boolean isAlive()
Process. - Возвращает:
-
true, если процесс, представленный этим объектомProcessещё не завершился. - Since:
- 1.8
pid
public long pid()
- Требования к реализации:
- Реализация этого метода возвращает идентификатор процесса как:
toHandle().pid(). - Возвращает:
- родной идентификатор процесса
- Исключение:
-
UnsupportedOperationException— если реализация процесса не поддерживает эту операцию - С версии:
- 9
onExit
public CompletableFuture<Process> onExit()
CompletableFuture<Process> для завершения процесса. Объект CompletableFuture предоставляет возможность запуска зависимых функций или действий, которые могут выполняться синхронно или асинхронно при завершении процесса. Когда процесс завершается, CompletableFuture completed, независимо от статуса завершения процесса. Вызов onExit().get() ожидает завершения процесса и возвращает процесс. Этот объект можно использовать для проверки, завершен ли процесс done, или для ожидания его завершения wait. Отмена CompletableFuture не влияет на процесс.
Процессы, возвращаемые из ProcessBuilder.start(), переопределяют стандартную реализацию, чтобы обеспечить эффективный механизм ожидания завершения процесса.
- Примечание API:
- Использование
onExit— это альтернативаwaitFor, которая позволяет использовать дополнительную конкуреность и удобный доступ к результату процесса. Можно использовать лямбда-выражения для оценки результата выполнения процесса. Если необходимо выполнить дополнительные действия перед использованием значения, то onExit — удобный механизм для освобождения текущей нити и блокировки только тогда, когда значение необходимо.
Например, запуск процесса для сравнения двух файлов и получения булевого значения, если они идентичны:
, Процесс может быть замечен завершенным сProcess p = new ProcessBuilder("cmp", "f1", "f2").start(); Future<Boolean> identical = p.onExit().thenApply(p1 -> p1.exitValue() == 0); ... if (identical.get()) { ... }isAlive()до того, как CompletableFuture завершит выполнение и будут вызваны зависимые действия. - Требования к реализации:
- Эта реализация выполняет
waitFor()в отдельной нити повторно до тех пор, пока не вернется успешно. Если выполнениеwaitForпрерывается, статус прерывания нити сохраняется.Когда
waitFor()возвращается успешно, CompletableFuture завершается независимо от статуса завершения процесса. Эта реализация может потреблять много памяти для стеков потоков, если большое количество процессов ожидает одновременного выполнения.Внешние реализации должны переопределить этот метод и предоставить более эффективную реализацию. Например, для делегирования подлежащему процессу можно сделать следующее:
public CompletableFuture<Process> onExit() { return delegate.onExit().thenApply(p -> this); } - Возвращает:
- новый
CompletableFuture<Process>для процесса - С версии:
- 9
toHandle
public ProcessHandle toHandle()
Process объекты, возвращаемые ProcessBuilder.start() и Runtime.exec(java.lang.String), реализуют toHandle как эквивалент ProcessHandle.of(pid), включая проверку SecurityManager и RuntimePermission("manageProcess").- Требования к реализации:
- Эта реализация генерирует исключение
UnsupportedOperationExceptionи не выполняет никаких других действий. Подклассы должны переопределить этот метод, чтобы предоставить ProcessHandle для процесса. Методыpid(),info(),children()иdescendants(), если не переопределены, работают с ProcessHandle. - Возвращает:
- Возвращает ProcessHandle для процесса
- Исключение:
-
UnsupportedOperationException— если реализация процесса не поддерживает эту операцию -
SecurityException— если установлен менеджер безопасности и он запрещает RuntimePermission("manageProcess") - С версии:
- 9
info
public ProcessHandle.Info info()
Объект ProcessHandle.Info имеет методы доступа, которые возвращают информацию о процессе, если она доступна.
- Требования к реализации:
- Эта реализация возвращает информацию о процессе как:
toHandle().info(). - Возвращает:
- моментальный снимок информации о процессе, всегда не null
- Исключение:
-
UnsupportedOperationException— если реализация процесса не поддерживает эту операцию - С версии:
- 9
children
public Stream<ProcessHandle> children()
Обратите внимание, что процессы создаются и завершаются асинхронно. Нет гарантии, что процесс активен.
- Требования к реализации:
- Эта реализация возвращает прямых потомков как:
toHandle().children(). - Возвращает:
- последовательный поток ProcessHandles для процессов, которые являются прямыми потомками процесса
- Исключение:
-
UnsupportedOperationException— если реализация процесса не поддерживает эту операцию -
SecurityException— если установлен менеджер безопасности и он запрещает RuntimePermission("manageProcess") - С версии:
- 9
descendants
public Stream<ProcessHandle> descendants()
Обратите внимание, что процессы создаются и завершаются асинхронно. Нет гарантии, что процесс активен.
- Требования к реализации:
- Эта реализация возвращает всех потомков как:
toHandle().descendants(). - Возвращает:
- последовательный поток ProcessHandles для процессов, которые являются потомками процесса
- Исключение:
-
UnsupportedOperationException— если реализация процесса не поддерживает эту операцию -
SecurityException— если установлен менеджер безопасности и он запрещает RuntimePermission("manageProcess") - С версии:
- 9
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Process.html