Spec-Zone.ru › OpenJDK 17

Класс Process

java.lang.Object
java.lang.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(Charset charset)
Возвращает BufferedReader, подключенный к стандартному потоку ошибок этого процесса с использованием кодировки.
abstract int exitValue()
Возвращает выходное значение для процесса.
abstract InputStream getErrorStream()
Возвращает поток ввода, подключенный к выводу ошибок процесса.
abstract InputStream getInputStream()
Возвращает поток ввода, подключенный к обычному выводу процесса.
abstract OutputStream getOutputStream()
Возвращает поток вывода, подключенный к обычному вводу процесса.
ProcessHandle.Info info()
Возвращает снимок информации о процессе.
final BufferedReader inputReader()
Возвращает BufferedReader, подключенный к стандартному выводу процесса.
final BufferedReader inputReader(Charset charset)
Возвращает BufferedReader, подключенный к стандартному выводу этого процесса с использованием кодировки.
boolean isAlive()
Проверяет, жив ли процесс, представленный этим Process объектом.
CompletableFuture<Process> onExit()
Возвращает CompletableFuture<Process> для завершения процесса.
final BufferedWriter outputWriter()
Возвращает BufferedWriter , подключенный к стандартному вводу процесса с использованием кодировки по умолчанию.
final BufferedWriter outputWriter(Charset charset)
Возвращает BufferedWriter , подключенный к стандартному вводу процесса с использованием кодировки.
long pid()
Возвращает идентификатор процесса нативной платформы.
boolean supportsNormalTermination()
Возвращает true , если реализация destroy() обычно завершает процесс; возвращает false , если реализация destroy принудительно и немедленно завершает процесс.
ProcessHandle toHandle()
Возвращает ProcessHandle для процесса.
abstract int waitFor()
Принудительно заставляет текущий поток подождать, если необходимо, пока процесс, представленный этим Process объектом, не завершит свою работу.
boolean waitFor(long timeout, TimeUnit unit)
Заставляет текущий поток подождать, если необходимо, пока процесс, представленный этим Process объектом, не завершит свою работу или не истечёт заданное время ожидания.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

Process

public Process()
Конструктор по умолчанию для 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 - если указанная кодировка charset null
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()
Возвращает родной идентификатор процесса (PID) процесса. Родной 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()
Возвращает ProcessHandle для процесса. Объекты 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API