Класс 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(), чтобы обеспечить полноценный процесс, включая идентификатор процесса, информацию о процессе, прямых потомков и прямых потомков, плюс потомков этих потомков процесса. Делегирование к базовому Process или ProcessHandle, как правило, является самым простым и эффективным способом.
- С:
- 1.0
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Process() |
Конструктор по умолчанию для Process. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
Stream |
children() |
Возвращает моментальный снимок прямых потомков процесса. |
Stream |
descendants() |
Возвращает моментальный снимок потомков процесса. |
abstract void |
destroy() |
Прерывает процесс. |
Process |
destroyForcibly() |
Прерывает процесс принудительно. |
final BufferedReader |
errorReader() |
Возвращает BufferedReader, подключенный к стандартному потоку ошибок процесса. |
final BufferedReader |
errorReader |
Возвращает BufferedReader, подключенный к стандартному потоку ошибок этого процесса, используя кодировку Charset. |
abstract int |
exitValue() |
Возвращает значение выхода процесса. |
abstract InputStream |
getErrorStream() |
Возвращает поток ввода, подключенный к потоку вывода ошибок процесса. |
abstract InputStream |
getInputStream() |
Возвращает поток ввода, подключенный к обычному потоку вывода процесса. |
abstract OutputStream |
getOutputStream() |
Возвращает поток вывода, подключенный к обычному потоку ввода процесса. |
ProcessHandle.Info |
info() |
Возвращает моментальный снимок информации о процессе. |
final BufferedReader |
inputReader() |
Возвращает BufferedReader, подключенный к стандартному выводу процесса. |
final BufferedReader |
inputReader |
Возвращает BufferedReader, подключенный к стандартному выводу этого процесса, используя кодировку Charset. |
boolean |
isAlive() |
Проверяет, жив ли процесс, представленный этим объектом Process. |
CompletableFuture |
onExit() |
Возвращает CompletableFuture<Process> для завершения Process. |
final BufferedWriter |
outputWriter() |
Возвращает BufferedWriter, подключенный к обычному потоку ввода процесса, используя нативную кодировку. |
final BufferedWriter |
outputWriter |
Возвращает BufferedWriter, подключенный к обычному потоку ввода процесса, используя кодировку Charset. |
long |
pid() |
Возвращает идентификатор нативного процесса. |
boolean |
supportsNormalTermination() |
Возвращает true, если реализация destroy() должна нормальным образом завершить процесс. Возвращает false, если реализация destroy принудительно и немедленно завершает процесс. |
ProcessHandle |
toHandle() |
Возвращает ProcessHandle для процесса. |
abstract int |
waitFor() |
Принудительно ожидает завершения процесса, представленного этим объектом Process. |
boolean |
waitFor |
Принудительно ожидает завершения процесса, представленного этим объектом Process, или до истечения указанного времени ожидания. |
boolean |
waitFor |
Принудительно ожидает завершения процесса, представленного этим объектом Process, или до истечения указанного интервала ожидания. |
Подробное описание конструкторов
Process
public Process()
Подробное описание методов
getOutputStream
public abstract OutputStream getOutputStream()
Process. Если стандартный ввод процесса был перенаправлен с помощью ProcessBuilder.redirectInput, то этот метод вернёт нулевой поток вывода.
- API Note:
- При записи в
getOutputStream()и вoutputWriter()илиoutputWriter(Charset), следует вызватьBufferedWriter.flushперед записью вOutputStream. - Implementation Note:
- Реализация: Рекомендуется буферизовать возвращаемый поток вывода.
- Returns:
- поток вывода, подключенный к стандартному вводу процесса
getInputStream
public abstract InputStream getInputStream()
Process. Если стандартный вывод процесса был перенаправлен с помощью ProcessBuilder.redirectOutput, то этот метод вернёт нулевой поток ввода.
В противном случае, если стандартный вывод ошибок процесса был перенаправлен с помощью ProcessBuilder.redirectErrorStream, то поток ввода, возвращаемый этим методом, получит объединённый стандартный вывод и стандартный вывод ошибок процесса.
- API Note:
- Используйте
getInputStream()иinputReader()с осторожностью.BufferedReaderможет буферизовать ввод из потока. - Implementation Note:
- Реализация: Рекомендуется буферизовать возвращаемый поток ввода.
- Returns:
- поток ввода, подключенный к стандартному выводу процесса
getErrorStream
public abstract InputStream getErrorStream()
Process. Если стандартный вывод ошибок процесса был перенаправлен с помощью ProcessBuilder.redirectError или ProcessBuilder.redirectErrorStream, то этот метод вернёт нулевой поток ввода.
- API Note:
- Используйте
getErrorStream()иerrorReader()с осторожностью.BufferedReaderможет буферизовать ввод из потока ошибок. - Implementation Note:
- Реализация: Рекомендуется буферизовать возвращаемый поток ввода.
- Returns:
- поток ввода, подключенный к выводу ошибок процесса
inputReader
public final BufferedReader inputReader()
BufferedReader, подключенный к стандартному выводу процесса. Используется кодировка по умолчанию для чтения символов, строк или потоков строк со стандартного вывода. Этот метод делегирует вызов inputReader(Charset), используя кодировку, заданную системной переменной native.encoding. Если native.encoding — недопустимое или неподдерживаемое имя кодировки, используется Charset.defaultCharset().
- Returns:
BufferedReader, использующийnative.encoding, если поддерживается, в противном случаеCharset.defaultCharset()- Since:
- 17
inputReader
public final BufferedReader inputReader(Charset charset)
BufferedReader, подключенный к стандартному выводу этого процесса, используя кодировку. BufferedReader можно использовать для чтения символов, строк или потоков строк со стандартного вывода. Символы читаются с помощью InputStreamReader, который читает и декодирует байты из потока getInputStream() этого процесса. Байты декодируются в символы с помощью charset; некорректные входные данные и неотображаемые последовательности символов заменяются стандартной заменой кодировки. BufferedReader читает и буферизует символы из InputStreamReader.
Первый вызов этого метода создаёт BufferedReader, если его снова вызвать с тем же charset, возвращается тот же BufferedReader. Ошибка — повторный вызов с другой charset.
Если стандартный вывод процесса был перенаправлен с помощью ProcessBuilder.redirectOutput, то InputStreamReader будет читать из нулевого потока ввода.
В противном случае, если стандартный вывод ошибок процесса был перенаправлен с помощью ProcessBuilder.redirectErrorStream, то читатель ввода, возвращаемый этим методом, получит объединённый стандартный вывод и стандартный вывод ошибок процесса.
- API Note:
- Использование как
getInputStream(), так иinputReader(Charset)приводит к непредсказуемому поведению, так как буферизованный читатель читает вперёд из потока ввода.После завершения процесса и при отсутствии перенаправления стандартного ввода, чтение доступных байтов из базового потока выполняется в лучшем возможном режиме и может быть непредсказуемым.
- Parameters:
-
charset-Charset, используемый для декодирования байтов в символы - Returns:
BufferedReaderдля стандартного вывода процесса, используяcharset- Throws:
-
NullPointerException- еслиcharsetnull -
IllegalStateException- если вызывается более одного раза с разными аргументами кодировки - Since:
- 17
errorReader
public final BufferedReader errorReader()
BufferedReader, подключенный к стандартному выводу ошибок процесса. Используется кодировка по умолчанию для чтения символов, строк или потоков строк со стандартного вывода ошибок. Этот метод делегирует вызов errorReader(Charset), используя кодировку, заданную системной переменной native.encoding. Если native.encoding — недопустимое или неподдерживаемое имя кодировки, используется Charset.defaultCharset().
- Returns:
BufferedReader, использующийnative.encoding, если поддерживается, в противном случаеCharset.defaultCharset()- Since:
- 17
errorReader
public final BufferedReader errorReader(Charset charset)
BufferedReader, подключённый к стандартному потоку ошибок этого процесса, используя кодировку. Этот BufferedReader может использоваться для чтения символов, строк или потоков строк стандартного потока ошибок. Символы считываются с помощью InputStreamReader, который считывает и декодирует байты из этого процесса getErrorStream(). Байты декодируются в символы, используя charset; неверные входные данные и последовательности символов, не имеющие соответствия, заменяются стандартной замещающей последовательностью кодировки. BufferedReader считывает и буферизует символы из InputStreamReader.
Первый вызов этого метода создаёт BufferedReader, если вызывается повторно с тем же charset, то возвращается тот же самый BufferedReader. Ошибка возникает при повторном вызове этого метода с другой charset.
Если стандартный поток ошибок процесса был перенаправлен с помощью ProcessBuilder.redirectError или ProcessBuilder.redirectErrorStream, то InputStreamReader будет считывать из нулевого входного потока.
- API Note:
- Использование и
getErrorStream()иerrorReader(Charset)приводит к непредсказуемому поведению, так как буферизованный читатель считывает данные из потока ошибок предварительно.После завершения процесса и при отсутствии перенаправления стандартного потока ошибок, чтение доступных байтов из базового потока выполняется по принципу «лучше, чем ничего», и может быть непредсказуемым.
- Parameters:
-
charset-Charsetдля декодирования байтов в символы - Returns:
BufferedReaderдля стандартного потока ошибок процесса, используяcharset- Throws:
-
NullPointerException- еслиcharsetявляетсяnull -
IllegalStateException- если вызывается более одного раза с разными аргументами charset - Since:
- 17
outputWriter
public final BufferedWriter outputWriter()
BufferedWriter, подключённый к обычному входу процесса, используя родную кодировку. Записывает текст в поток символьного вывода, буферизуя символы для эффективной записи отдельных символов, массивов и строк. Этот метод делегирует вызов outputWriter(Charset), используя Charset, заданную свойством системы native.encoding. Если native.encoding не является допустимым именем кодировки или не поддерживается, используется Charset.defaultCharset().
- Returns:
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.- Parameters:
-
charset-Charsetдля кодирования символов в байты - Returns:
BufferedWriterдля стандартного входного потока процесса, используяcharset- Throws:
-
NullPointerException- еслиcharsetявляетсяnull -
IllegalStateException- если вызывается более одного раза с разными аргументами charset - Since:
- 17
waitFor
public abstract int waitFor() throws InterruptedException
Process объектом, не завершится. Этот метод возвращает значение немедленно, если процесс уже завершен. Если процесс еще не завершен, вызывающая нить будет заблокирована до завершения процесса.- Returns:
- значение выхода процесса, представленного этим
Processобъектом. По соглашению, значение0указывает на нормальное завершение. - Throws:
-
InterruptedException- если текущая нить прерывается другой нитью во время ожидания, ожидание завершается, и выбрасывается исключениеInterruptedException.
waitFor
public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException
Process объектом, не завершится или не истечёт указанное время ожидания. Если процесс уже завершен, этот метод возвращает значение немедленно с значением true. Если процесс не завершен, а значение тайм-аута меньше или равно нулю, то этот метод возвращает немедленно значение false.
- Implementation Requirements:
- Предпочтительная реализация этого метода опрашивает
exitValue, чтобы проверить, завершился ли процесс. - Implementation Note:
- Конкретные реализации этого класса настоятельно рекомендуют переопределить этот метод с более эффективной реализацией.
- Parameters:
-
timeout- максимальное время ожидания -
unit- единица измерения времени для аргументаtimeout - Returns:
-
true, если процесс завершился, иfalse, если время ожидания истекло до завершения процесса. - Throws:
-
InterruptedException- если текущая нить прерывается во время ожидания. -
NullPointerException- если unit равен null - Since:
- 1.8
waitFor
public boolean waitFor(Duration duration) throws InterruptedException
Process объектом, не завершится или не истечёт указанное время ожидания. Если процесс уже завершен, этот метод возвращает значение немедленно с значением true. Если процесс не завершен, а длительность не положительна, этот метод возвращает немедленно значение false.
- Implementation Requirements:
- Предпочтительная реализация этого метода опрашивает
exitValue, чтобы проверить, завершился ли процесс. - Implementation Note:
- Конкретные реализации этого класса настоятельно рекомендуют переопределить этот метод с более эффективной реализацией.
- Parameters:
-
duration- максимальное время ожидания; если не положительно, этот метод возвращается немедленно. - Returns:
-
true, если процесс завершился, иfalse, если время ожидания истекло до завершения процесса. - Throws:
-
InterruptedException- если текущая нить прерывается во время ожидания. -
NullPointerException- если duration равно null - Since:
- 24
exitValue
public abstract int exitValue()
- Returns:
- значение выхода процесса, представленного этим
Processобъектом. По соглашению, значение0указывает на нормальное завершение. - Throws:
-
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:
- Конкретным реализациям этого класса настоятельно рекомендуется переопределить этот метод с соответствующей реализацией.
- Returns:
- объект
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и не выполняет никаких других действий. - Returns:
-
true, если реализацияdestroy()должна нормально завершить процесс; в противном случаеdestroy()принудительно завершает процесс - Throws:
-
UnsupportedOperationException- если реализация процесса не поддерживает эту операцию - Since:
- 9
isAlive
public boolean isAlive()
Process.- Returns:
-
true, если процесс, представленный этимProcessобъектом, еще не завершился. - Since:
- 1.8
pid
public long pid()
- Implementation Requirements:
- Реализация этого метода возвращает идентификатор процесса как:
toHandle().pid(). - Returns:
- системный идентификатор процесса
- Throws:
-
UnsupportedOperationException- если реализация процесса не поддерживает эту операцию - Since:
- 9
onExit
public CompletableFuture<Process> onExit()
CompletableFuture<Process> для завершения процесса. CompletableFuture предоставляет возможность запуска зависимых функций или действий, которые могут выполняться синхронно или асинхронно при завершении процесса. При завершении процесса CompletableFuture completed, независимо от кода завершения процесса. Вызов onExit().get() ожидает завершения процесса и возвращает Process. Future можно использовать для проверки, завершен ли процесс done, или для ожидания его завершения wait. Отмена CompletableFuture не влияет на Process.
Процессы, возвращаемые из ProcessBuilder.start(), переопределяют реализацию по умолчанию, чтобы обеспечить эффективный механизм ожидания завершения процесса.
- API Note:
- Использование
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()до завершения ComputableFuture и вызова зависимых действий. - Implementation Requirements:
- Эта реализация выполняет
waitFor()в отдельной нити повторно до тех пор, пока она не выполнится успешно. Если выполнениеwaitForпрерывается, состояние прерывания нити сохраняется.При успешном выполнении
waitFor()CompletableFuture завершается независимо от кода завершения процесса. Эта реализация может потреблять много памяти для стеков потоков, если для большого количества процессов ожидается одновременное выполнение.Внешние реализации должны переопределить этот метод и обеспечить более эффективную реализацию. Например, для делегирования подлежащему процессу можно сделать следующее:
public CompletableFuture<Process> onExit() { return delegate.onExit().thenApply(p -> this); } - Returns:
- новый
CompletableFuture<Process>для процесса - Since:
- 9
toHandle
public ProcessHandle toHandle()
Process объекты, возвращаемые ProcessBuilder.start() и Runtime.exec(java.lang.String), реализуют toHandle как эквивалент ProcessHandle.of(pid).- Implementation Requirements:
- Эта реализация выбрасывает экземпляр
UnsupportedOperationExceptionи не выполняет никаких других действий. Подклассы должны переопределить этот метод, чтобы предоставить ProcessHandle для процесса. Методыpid(),info(),children()иdescendants(), если не переопределены, работают с ProcessHandle. - Returns:
- Возвращает ProcessHandle для процесса
- Throws:
-
UnsupportedOperationException- если реализация процесса не поддерживает эту операцию - Since:
- 9
info
public ProcessHandle.Info info()
Объект ProcessHandle.Info имеет методы-акцессоры, которые возвращают информацию о процессе, если она доступна.
- Implementation Requirements:
- Эта реализация возвращает информацию о процессе как:
toHandle().info(). - Returns:
- моментальный снимок информации о процессе, всегда не null
- Throws:
-
UnsupportedOperationException- если реализация процесса не поддерживает эту операцию - Since:
- 9
children
public Stream<ProcessHandle> children()
Обратите внимание, что процессы создаются и завершаются асинхронно. Нет гарантии, что процесс активен.
- Implementation Requirements:
- Эта реализация возвращает прямых дочерних процессов как:
toHandle().children(). - Returns:
- последовательная Stream объектов ProcessHandles для процессов, которые являются прямыми дочерними процессами
- Throws:
-
UnsupportedOperationException- если реализация процесса не поддерживает эту операцию - Since:
- 9
descendants
public Stream<ProcessHandle> descendants()
Обратите внимание, что процессы создаются и завершаются асинхронно. Нет гарантии, что процесс активен.
- Требования к реализации:
- Эта реализация возвращает всех детей как:
toHandle().descendants(). - Возвращает:
- последовательную Stream объектов ProcessHandles для процессов, которые являются потомками процесса
- Выбрасывает:
-
UnsupportedOperationException— если реализация Process не поддерживает эту операцию - С:
- 9
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/Process.html