Класс 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(). Родительский процесс использует эти потоки для подачи ввода процессу и получения вывода от него. Поскольку некоторые платформы предоставляют ограниченный размер буфера для стандартных потоков ввода-вывода, отсутствие своевременного записи в поток ввода или чтения потока вывода процесса может привести к блокированию процесса или даже тупику.

Если необходимо, перенаправление ввода-вывода процесса также возможно с помощью методов класса ProcessBuilder.

Процесс не убивается при отсутствии ссылок на объект Process, а продолжает выполняться асинхронно.

Нет требования, чтобы процесс, представленный объектом Process, выполнялся асинхронно или параллельно с процессом Java, владеющим объектом Process.

Начиная с версии 1.5, ProcessBuilder.start() является предпочтительным способом создания Process.

Подклассы Process должны переопределять методы onExit() и toHandle(), чтобы обеспечить полностью функциональный Process, включая идентификатор процесса (PID), информацию о процессе (информация), прямых потомков (прямые потомки) и потомков этих потомков (прямые и косвенные потомки) процесса. Делегирование к базовому Process или ProcessHandle обычно является самым простым и эффективным подходом.

Since:
1.0

Конструкторы

Конструктор Описание
Process()

Конструктор по умолчанию для Process.

Методы

Модификатор и тип Метод Описание
Stream<ProcessHandle> children()

Возвращает снимок прямых потомков процесса.

Stream<ProcessHandle> descendants()

Возвращает снимок потомков процесса.

abstract void destroy()

Уничтожает процесс.

Process destroyForcibly()

Уничтожает процесс принудительно.

abstract int exitValue()

Возвращает значение завершения процесса.

abstract InputStream getErrorStream()

Возвращает поток ввода, связанный с ошибками вывода процесса.

abstract InputStream getInputStream()

Возвращает поток ввода, связанный со стандартным выводом процесса.

abstract OutputStream getOutputStream()

Возвращает поток вывода, связанный со стандартным вводом процесса.

ProcessHandle.Info info()

Возвращает снимок информации о процессе.

boolean isAlive()

Проверяет, жив ли процесс, представленный этим объектом Process.

CompletableFuture<Process> onExit()

Возвращает CompletableFuture<Process> для завершения процесса.

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

Конструкторы

Процесс

public Process()

Конструктор по умолчанию для Процесса.

Методы

getOutputStream

public abstract OutputStream getOutputStream()

Возвращает поток вывода, подключенный к стандартному вводу процесса. Вывод в поток направляется в стандартный ввод процесса, представленного этим Process объектом.

Если стандартный ввод процесса был перенаправлен с помощью ProcessBuilder.redirectInput, то этот метод вернёт пустой поток вывода.

Примечание по реализации: Хорошей практикой является буферизация возвращаемого потока вывода.

Возвращает:
поток вывода, подключенный к стандартному вводу процесса

getInputStream

public abstract InputStream getInputStream()

Возвращает поток ввода, подключенный к стандартному выводу процесса. Поток получает данные, направленные со стандартного вывода процесса, представленного этим Process объектом.

Если стандартный вывод процесса был перенаправлен с помощью ProcessBuilder.redirectOutput, то этот метод вернёт пустой поток ввода.

В противном случае, если стандартный вывод ошибок процесса был перенаправлен с помощью ProcessBuilder.redirectErrorStream, то поток ввода, возвращаемый этим методом, получит объединённый стандартный вывод и стандартный вывод ошибок процесса.

Примечание по реализации: Хорошей практикой является буферизация возвращаемого потока ввода.

Возвращает:
поток ввода, подключенный к стандартному выводу процесса

getErrorStream

public abstract InputStream getErrorStream()

Возвращает поток ввода, подключенный к выводу ошибок процесса. Поток получает данные, направленные со стандартного вывода ошибок процесса, представленного этим Process объектом.

Если стандартный вывод ошибок процесса был перенаправлен с помощью ProcessBuilder.redirectError или ProcessBuilder.redirectErrorStream, то этот метод вернёт пустой поток ввода.

Примечание по реализации: Хорошей практикой является буферизация возвращаемого потока ввода.

Возвращает:
поток ввода, подключенный к выводу ошибок процесса

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 - если unit равен 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<Process> для завершения процесса. CompletableFuture предоставляет возможность запуска зависимых функций или действий синхронно или асинхронно при завершении процесса. Когда процесс завершится, CompletableFuture completed независимо от кода завершения процесса.

Вызов onExit().get() ожидает завершения процесса и возвращает процесс. Можно использовать 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 завершается completed независимо от статуса завершения процесса. Эта реализация может потреблять много памяти для стеков нитей, если одновременно ожидается большое количество процессов.

Внешние реализации должны переопределить этот метод и обеспечить более эффективную реализацию. Например, для делегирования на процесс, можно сделать следующее:

public CompletableFuture<Process> onExit() {
       return delegate.onExit().thenApply(p -> this);
    }
Возвращает:
новый CompletableFuture<Process> для процесса
С момента:
9

toHandle

public ProcessHandle toHandle()

Возвращает ProcessHandle для процесса. 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 - если установлен SecurityManager и он отклоняет 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 - если установлен SecurityManager и он отклоняет RuntimePermission("manageProcess")
С момента:
9

descendants

public Stream<ProcessHandle> descendants()

Возвращает моментальный снимок потомков процесса. Потомки процесса — это дети процесса плюс потомки этих детей, рекурсивно. Обычно у завершенного процесса нет дочерних процессов.

Обратите внимание, что процессы создаются и завершаются асинхронно. Нет гарантии, что процесс активен.

Требования к реализации:
Эта реализация возвращает всех потомков как: toHandle().descendants().
Возвращает:
последовательную Stream из ProcessHandles для процессов, являющихся потомками процесса
Исключение:
UnsupportedOperationException - если реализация процесса не поддерживает эту операцию
SecurityException - если установлен SecurityManager и он отклоняет RuntimePermission("manageProcess")
С момента:
9

© 1993, 2020, 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/11/docs/api/java.base/java/lang/Process.html

Spec-Zone .ru
спецификации, руководства, описания, API