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