Spec-Zone.ru › OpenJDK 21

Класс 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() для предоставления полностью функционального процесса, включая идентификатор процесса (pid), информацию о процессе (info), прямых потомков (children) и потомков прямых потомков (descendants) процесса. Делегирование в подлежащий Process или 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 для Process.
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, то этот метод вернёт 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 - если 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; если он вызывается снова с той же кодировкой, возвращается тот же BufferedReader. Ошибка вызывать этот метод снова с другой кодировкой.

Если стандартная ошибка процесса была перенаправлена с помощью ProcessBuilder.redirectError или ProcessBuilder.redirectErrorStream, то InputStreamReader будет читать из null потока ввода.

Примечание 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
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 - если указанная charset null
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()
Возвращает 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 — если установлен менеджер безопасности и он запрещает 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

Spec-Zone.ru

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