Spec-Zone.ru › OpenJDK 27

Класс Process

java.lang.Object
java.lang.Process
Все реализуемые интерфейсы:
Closeable, AutoCloseable
public abstract class Process extends Object implements Closeable
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, выполнялся асинхронно или одновременно с процессом Java, которому принадлежит объект Process.

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

Подклассы Process должны обеспечивать вызов метода суперкласса каждым переопределенным методом. Например, если переопределен метод close, подкласс должен обеспечить вызов Process.close().

public class LoggingProcess extends java.lang.Process {
    ...
    @Override
    public void close() throws IOException  {
        try {
            super.close();
        } catch (IOException ex) {
            LOGGER.log(ex);
         } finally {
            LOGGER.log("process closed");
        }
    }
    ...
}

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

Использование ресурсов

Запуск процесса использует ресурсы как вызывающего, так и вызываемого процесса, а также ресурсы потоков связи между ними. Ресурсы для управления процессом и связи между процессами сохраняются, пока существуют ссылки на Process или его входные, выходные потоки и поток ошибок либо средства чтения, или пока эти потоки не будут закрыты. Метод Process close закрывает все потоки и завершает процесс, освобождая ресурсы. Использование конструкции try-with-resources гарантирует завершение процесса при выходе из блока try-with-resources.

Процесс не завершается, когда на объект Process больше нет ссылок, а продолжает выполняться асинхронно. Реализация процесса закрывает файловые дескрипторы и дескрипторы потоков, на которые больше нет ссылок, чтобы предотвратить утечку ресурсов операционной системы. За завершенными или принудительно остановленными процессами ведется наблюдение, после чего их ресурсы освобождаются.

Потоки следует закрывать, когда они больше не нужны, чтобы не задерживать освобождение ресурсов операционной системы. Для открытия и закрытия потоков можно использовать Try-with-resources.

Например, чтобы перехватить вывод программы, которая, как известно, выдает некоторый результат, а затем завершается:

List<String> capture(List<String> args) throws Exception {
    ProcessBuilder pb = new ProcessBuilder(args);
    try (Process process = pb.start();
         BufferedReader in = process.inputReader()) {
        List<String> captured = in.readAllLines();
        int status = process.waitFor();
        if (status != 0) {
            throw new RuntimeException("Process %d: %s failed with %d"
                        .formatted(process.pid(), args, status));
        }
        return captured;
    }
}

Ресурсы потоков (файловые дескрипторы или дескрипторы) всегда образуют пару: один находится в вызывающем процессе, а другой конец этого соединения — в вызываемом процессе. Закрытие потока на любом конце прекращает связь, но напрямую не влияет на другой Process. Закрытие потока обычно приводит к завершению другого процесса.

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

Начиная с версии:
1.0

Краткое описание конструкторов

Конструктор Описание
Process()
Конструктор Process по умолчанию.

Краткое описание методов

Модификатор и тип Метод Описание
Stream<ProcessHandle> children()
Возвращает снимок непосредственных дочерних процессов.
void close()
Закрывает все потоки чтения и записи и ожидает завершения процесса.
Stream<ProcessHandle> descendants()
Возвращает снимок потомков процесса.
abstract void destroy()
Завершает процесс.
Process destroyForcibly()
Принудительно завершает процесс.
final BufferedReader errorReader()
Возвращает BufferedReader, подключенный к стандартному потоку ошибок процесса.
final BufferedReader errorReader(Charset charset)
Возвращает BufferedReader, подключенный к стандартному потоку ошибок этого процесса и использующий Charset.
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, подключенный к стандартному потоку вывода этого процесса и использующий Charset.
boolean isAlive()
Проверяет, выполняется ли процесс, представленный этим Process.
CompletableFuture<Process> onExit()
Возвращает CompletableFuture<Process>, связанный с завершением Process.
final BufferedWriter outputWriter()
Возвращает BufferedWriter, подключенный к стандартному потоку ввода процесса и использующий нативную кодировку.
final BufferedWriter outputWriter(Charset charset)
Возвращает BufferedWriter, подключенный к стандартному потоку ввода процесса и использующий Charset.
long pid()
Возвращает нативный идентификатор процесса.
boolean supportsNormalTermination()
Возвращает true, если реализация destroy() предусматривает обычное завершение процесса; возвращает false, если реализация destroy принудительно и немедленно завершает процесс.
ProcessHandle toHandle()
Возвращает ProcessHandle для Process.
abstract int waitFor()
При необходимости заставляет текущий поток ожидать завершения процесса, представленного этим объектом Process.
boolean waitFor(long timeout, TimeUnit unit)
При необходимости заставляет текущий поток ожидать завершения процесса, представленного этим объектом Process, или истечения указанного времени ожидания.
boolean waitFor(Duration duration)
При необходимости заставляет текущий поток ожидать завершения процесса, представленного этим объектом Process, или истечения указанной продолжительности ожидания.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Показывает, равен ли другой объект этому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удален в будущей версии.
Финализация устарела и подлежит удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения заданного промежутка реального времени.

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

Process

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

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

close

public void close() throws IOException
Закрывает все потоки чтения и записи и ожидает завершения процесса. Этот метод идемпотентен: если этот Process уже был закрыт, вызов метода не оказывает никакого эффекта.

Если необходимы данные из потоков ввода или ошибок процесса, их нужно прочитать до вызова этого метода. Содержимое потоков, которые не были прочитаны до конца, теряется: оно отбрасывается или игнорируется.

Если представляет интерес код завершения процесса, вызывающий код должен дождаться завершения процесса перед вызовом этого метода.

Потоки следует закрывать, когда они больше не нужны. Закрытие уже закрытого потока обычно не оказывает никакого эффекта, однако это зависит от конкретного потока. Если при закрытии потока возникает IOException, исключение выбрасывается после завершения процесса. Исключения, возникшие при закрытии потоков, если таковые имеются, добавляются к первому IOException как подавленные исключения.

После закрытия потоков этот метод ожидает завершения процесса. Если во время ожидания возникает прерывание, процесс принудительно уничтожается, и метод продолжает ожидать его завершения. Перед возвратом из метода или выбрасыванием любых IOExceptions восстанавливается статус прерывания.

Определено в:
close в интерфейсе AutoCloseable
Определено в:
close в интерфейсе Closeable
Примечание к API:
Пример использования try-with-resources для записи текста в процесс, чтения ответа и закрытия потоков и процесса:
void main() {
    try (Process p = new ProcessBuilder("cat").start();
         var writer = p.outputWriter();
         var reader = p.inputReader()) {
        writer.write(haiku);
        writer.close();
        // Read all lines and print each
        reader.readAllLines()
                .forEach(IO::println);
        var status = p.waitFor();
        if (status != 0)
            throw new RuntimeException("unexpected process status: " + status);
    } catch (Exception e) {
        System.out.println("Process failed: " + e);
    }
}

static final String haiku = """
            Oh, the sunrise glow;
            Paddling with the river flow;
            Chilling still, go slow.
            """;
Требования к реализации:
Этот метод закрывает потоки ввода-вывода процесса, а затем ожидает его завершения. Если во время ожидания waitFor() возникает прерывание, процесс принудительно уничтожается, после чего close() ожидает завершения процесса.
Примечание по реализации:
Настоятельно рекомендуется, чтобы конкретные реализации, переопределяющие этот класс, переопределяли и этот метод, вызывая метод close суперкласса.
Выбрасывает:
IOException — если при закрытии любого из потоков возникает исключение
Начиная с версии:
26

getOutputStream

public abstract OutputStream getOutputStream()
Возвращает выходной поток, подключённый к стандартному вводу процесса. Данные, записываемые в этот поток, передаются в стандартный ввод процесса, представленного этим объектом Process.

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

Выходной поток следует закрыть, когда он больше не нужен.

Примечание к API:
При записи и в getOutputStream(), и в один из потоков outputWriter() или outputWriter(Charset) перед записью в OutputStream следует вызвать BufferedWriter.flush.
Примечание по реализации:
Примечание по реализации: рекомендуется буферизовать возвращаемый выходной поток.
Возвращает:
выходной поток, подключённый к стандартному вводу процесса

getInputStream

public abstract InputStream getInputStream()
Возвращает входной поток, подключённый к стандартному выводу процесса. Поток получает данные, передаваемые из стандартного вывода процесса, представленного этим объектом Process.

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

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

Входной поток следует закрыть, когда он больше не нужен.

Примечание к API:
Используйте либо этот метод, либо средство чтения входных данных, но не оба сразу для одного и того же Process. Средство чтения входных данных считывает и буферизует байты из входного потока. Байты, прочитанные из входного потока, не будут видны средству чтения, а содержимое буфера будет непредсказуемым.
Примечание по реализации:
Примечание по реализации: рекомендуется буферизовать возвращаемый входной поток.
Возвращает:
входной поток, подключённый к стандартному выводу процесса

getErrorStream

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

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

Поток ошибок следует закрыть, когда он больше не нужен.

Примечание к API:
Используйте либо этот метод, либо средство чтения ошибок, но не оба сразу для одного и того же Process. Средство чтения ошибок считывает и буферизует байты из потока ошибок. Байты, прочитанные из потока ошибок, не будут видны средству чтения, а содержимое буфера будет непредсказуемым.
Примечание по реализации:
Примечание по реализации: рекомендуется буферизовать возвращаемый входной поток.
Возвращает:
входной поток, подключённый к потоку ошибок процесса

inputReader

public final BufferedReader inputReader()
Возвращает BufferedReader, подключённый к стандартному выводу процесса. Для чтения символов, строк или строк из потока стандартного вывода используется Charset для собственной кодировки.

Этот метод делегирует вызов inputReader(Charset), используя Charset, имя которой задано системным свойством native.encoding. Если значение native.encoding не является допустимым именем кодировки или кодировка не поддерживается, используется Charset.defaultCharset().

Средство чтения следует закрыть, когда оно больше не нужно.

Примечание к API:
Используйте либо этот метод, либо входной поток, но не оба сразу для одного и того же Process. Средство чтения входных данных считывает и буферизует байты из входного потока. Байты, прочитанные из входного потока, не будут видны средству чтения, а содержимое буфера будет непредсказуемым.
Возвращает:
BufferedReader, использующее native.encoding, если она поддерживается; в противном случае — Charset.defaultCharset()
Начиная с версии:
17

inputReader

public final BufferedReader inputReader(Charset charset)
Возвращает BufferedReader, подключённый к стандартному выводу этого процесса с использованием Charset. BufferedReader можно использовать для чтения символов, строк или строк из потока стандартного вывода.

Символы считываются с помощью InputStreamReader, который читает и декодирует байты из getInputStream() этого процесса. Байты декодируются в символы с использованием charset; последовательности некорректных входных данных и символов, не имеющих соответствия, заменяются стандартной заменой для этой кодировки. BufferedReader считывает символы из InputStreamReader и буферизует их.

При первом вызове этого метода создаётся BufferedReader; при повторном вызове с тем же charset возвращается тот же BufferedReader. Повторный вызов этого метода с другим charset приводит к ошибке.

Если стандартный вывод процесса был перенаправлен с помощью ProcessBuilder.redirectOutput, InputStreamReader будет считывать данные из входного потока-заглушки.

Средство чтения следует закрыть, когда оно больше не нужно.

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

Примечание к API:
Используйте либо этот метод, либо входной поток, но не оба сразу для одного и того же Process. Средство чтения входных данных считывает и буферизует байты из входного потока. Байты, прочитанные из входного потока, не будут видны средству чтения, а содержимое буфера будет непредсказуемым.

После завершения процесса, если стандартный ввод не был перенаправлен, чтение доступных байтов из базового потока выполняется по возможности и может быть непредсказуемым.

Параметры:
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().

Средство чтения ошибок следует закрыть, когда оно больше не нужно.

Примечание к API:
Используйте либо этот метод, либо поток ошибок, но не оба сразу для одного и того же Process. Средство чтения ошибок считывает и буферизует байты из потока ошибок. Байты, прочитанные из потока ошибок, не будут видны средству чтения, а содержимое буфера будет непредсказуемым.
Возвращает:
BufferedReader, использующее native.encoding, если она поддерживается; в противном случае — Charset.defaultCharset()
Начиная с версии:
17

errorReader

public final BufferedReader errorReader(Charset charset)
Возвращает BufferedReader, подключённый к стандартному потоку ошибок этого процесса с использованием Charset. BufferedReader можно использовать для чтения символов, строк или строк из потока стандартных ошибок.

Символы считываются с помощью InputStreamReader, который читает и декодирует байты из getErrorStream() этого процесса. Байты декодируются в символы с использованием charset; последовательности некорректных входных данных и символов, не имеющих соответствия, заменяются стандартной заменой для этой кодировки. BufferedReader считывает символы из InputStreamReader и буферизует их.

При первом вызове этого метода создаётся BufferedReader; при повторном вызове с тем же charset возвращается тот же BufferedReader. Повторный вызов этого метода с другим charset приводит к ошибке.

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

Средство чтения ошибок следует закрыть, когда оно больше не нужно.

Примечание к API:
Используйте либо этот метод, либо поток ошибок, но не оба сразу для одного и того же Process. Средство чтения ошибок считывает и буферизует байты из потока ошибок. Байты, прочитанные из потока ошибок, не будут видны средству чтения, а содержимое буфера будет непредсказуемым.

После завершения процесса, если стандартный поток ошибок не был перенаправлен, чтение доступных байтов из базового потока выполняется по возможности и может быть непредсказуемым.

Параметры:
charset — Charset, используемая для декодирования байтов в символы
Возвращает:
BufferedReader для стандартного потока ошибок процесса, использующее charset
Выбрасывает:
NullPointerException — если charset равен null
IllegalStateException — если метод вызван более одного раза с разными аргументами кодировки
Начиная с версии:
17

outputWriter

public final BufferedWriter outputWriter()
Возвращает BufferedWriter, подключённый к стандартному вводу процесса и использующий собственную кодировку. Записывает текст в поток вывода символов, буферизуя символы для эффективной записи отдельных символов, массивов и строк.

Этот метод делегирует вызов outputWriter(Charset), используя Charset, имя которой задано системным свойством native.encoding. Если значение native.encoding не является допустимым именем кодировки или кодировка не поддерживается, используется Charset.defaultCharset().

Средство записи следует закрыть, когда оно больше не нужно.

Возвращает:
BufferedWriter для стандартного ввода процесса, использующее кодировку, заданную системным свойством native.encoding
Начиная с версии:
17

outputWriter

public final BufferedWriter outputWriter(Charset charset)
Возвращает BufferedWriter, подключённый к стандартному вводу процесса и использующий Charset. Записывает текст в поток вывода символов, буферизуя символы для эффективной записи отдельных символов, массивов и строк.

Символы, записанные средством записи, кодируются в байты с помощью OutputStreamWriter, а Charset записываются в стандартный ввод процесса, представленного этим объектом Process. Последовательности некорректных входных данных и символов, не имеющих соответствия, заменяются стандартной заменой для этой кодировки.

При первом вызове этого метода создаётся BufferedWriter; при повторном вызове с тем же charset возвращается тот же BufferedWriter. Повторный вызов этого метода с другим charset приводит к ошибке.

Если стандартный ввод процесса был перенаправлен с помощью ProcessBuilder.redirectInput, OutputStreamWriter записывает данные в выходной поток-заглушку.

Средство записи следует закрыть, когда оно больше не нужно.

Примечание к API:
BufferedWriter записывает символы, массивы символов и строки. Обёртывание BufferedWriter в PrintWriter обеспечивает эффективную буферизацию и форматирование примитивов и объектов, а также поддержку автоматического сброса при завершении строк. Для сброса буферизованных данных в процесс вызовите метод BufferedWriter.flush().

При записи и в getOutputStream(), и в один из потоков outputWriter() или outputWriter(Charset) перед записью в OutputStream следует вызвать BufferedWriter.flush.

Параметры:
charset — 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.

Требования к реализации:
Реализация этого метода по умолчанию опрашивает exitValue, чтобы проверить, завершился ли процесс.
Примечание по реализации:
Настоятельно рекомендуется, чтобы конкретные реализации этого класса переопределяли данный метод, используя более эффективную реализацию.
Параметры:
timeout — максимальное время ожидания
unit — единица измерения времени для аргумента timeout
Возвращает:
true, если процесс завершился, и false, если время ожидания истекло до завершения процесса.
Выбрасывает:
InterruptedException — если текущий поток прерван во время ожидания.
NullPointerException — если unit равен null
Начиная с версии:
1.8

waitFor

public boolean waitFor(Duration duration) throws InterruptedException
При необходимости заставляет текущий поток ожидать завершения процесса, представленного этим объектом Process, либо истечения указанной продолжительности ожидания.

Если процесс уже завершился, этот метод немедленно возвращает значение true. Если процесс ещё не завершился, а продолжительность не является положительной, этот метод немедленно возвращает значение false.

Требования к реализации:
Реализация этого метода по умолчанию опрашивает exitValue, чтобы проверить, завершился ли процесс.
Примечание по реализации:
Настоятельно рекомендуется, чтобы конкретные реализации этого класса переопределяли данный метод, используя более эффективную реализацию.
Параметры:
duration — максимальная продолжительность ожидания; если она не является положительной, метод немедленно возвращает управление.
Возвращает:
true, если процесс завершился, и false, если продолжительность ожидания истекла до завершения процесса.
Выбрасывает:
InterruptedException — если текущий поток прерван во время ожидания.
NullPointerException — если duration равен null
Начиная с версии:
24

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(String), приводит к принудительному завершению процесса.

Примечание к API:
Процесс может завершиться не сразу. То есть isAlive() может возвращать true в течение короткого времени после вызова destroyForcibly(). При необходимости этот метод можно объединить в цепочку с waitFor().
Требования к реализации:
Реализация этого метода по умолчанию вызывает destroy(), поэтому принудительное завершение процесса не гарантируется.
Примечание по реализации:
Настоятельно рекомендуется, чтобы конкретные реализации этого класса переопределяли данный метод, предоставляя соответствующую требованиям реализацию.
Возвращает:
объект Process, представляющий принудительно завершённый процесс
Начиная с версии:
1.8

supportsNormalTermination

public boolean supportsNormalTermination()
Возвращает true, если реализация метода destroy() завершает процесс обычным образом; возвращает false, если реализация метода destroy принудительно и немедленно завершает процесс.

Вызов этого метода для объектов Process, возвращаемых методами ProcessBuilder.start() и Runtime.exec(String), возвращает true или false в зависимости от реализации платформы.

Требования к реализации:
Эта реализация выбрасывает экземпляр UnsupportedOperationException и не выполняет никаких других действий.
Возвращает:
true, если реализация метода destroy() завершает процесс обычным образом; в противном случае destroy() принудительно завершает процесс
Выбрасывает:
UnsupportedOperationException — если реализация Process не поддерживает эту операцию
Начиная с версии:
9

isAlive

public boolean isAlive()
Проверяет, работает ли процесс, представленный этим Process.
Возвращает:
true, если процесс, представленный этим объектом Process, ещё не завершился.
Начиная с версии:
1.8

pid

public long pid()
Возвращает идентификатор процесса в операционной системе. Идентификатор процесса — это номер, который операционная система присваивает процессу.
Требования к реализации:
Реализация этого метода возвращает идентификатор процесса следующим образом: toHandle().pid().
Возвращает:
идентификатор процесса в операционной системе
Выбрасывает:
UnsupportedOperationException — если реализация Process не поддерживает эту операцию
Начиная с версии:
9

onExit

public CompletableFuture<Process> onExit()
Возвращает CompletableFuture<Process> для завершения процесса. CompletableFuture предоставляет возможность запускать зависимые функции или действия, которые могут выполняться синхронно или асинхронно после завершения процесса. После завершения процесса CompletableFuture completed независимо от кода завершения процесса.

Вызов onExit().get() ожидает завершения процесса и возвращает Process. Будущее можно использовать, чтобы проверить, завершено ли оно, или ожидать завершения процесса. Отмена CompletableFuture не влияет на Process.

Процессы, возвращаемые ProcessBuilder.start(), переопределяют реализацию по умолчанию, предоставляя эффективный механизм ожидания завершения процесса.

Примечание API:
Использование onExit — это альтернатива waitFor, которая обеспечивает дополнительную возможность параллельного выполнения и удобный доступ к результату работы Process. Лямбда-выражения можно использовать для вычисления результата выполнения Process. Если перед использованием значения требуется выполнить другую обработку, 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> для Process
С версии:
9

toHandle

public ProcessHandle toHandle()
Возвращает ProcessHandle для Process. Объекты Process, возвращаемые ProcessBuilder.start() и Runtime.exec(String), реализуют toHandle как эквивалент ProcessHandle.of(pid).
Требования к реализации:
Эта реализация выбрасывает экземпляр UnsupportedOperationException и не выполняет никаких других действий. Подклассам следует переопределить этот метод, чтобы предоставить ProcessHandle для процесса. Методы pid(), info(), children() и descendants(), если они не переопределены, работают с ProcessHandle.
Возвращает:
ProcessHandle для Process
Выбрасывает:
UnsupportedOperationException — если реализация Process не поддерживает эту операцию
С версии:
9

info

public ProcessHandle.Info info()
Возвращает снимок сведений о процессе.

Экземпляр ProcessHandle.Info предоставляет методы доступа, возвращающие сведения о процессе, если они доступны.

Требования к реализации:
Эта реализация возвращает сведения о процессе, используя: toHandle().info().
Возвращает:
снимок сведений о процессе, всегда не равный null
Выбрасывает:
UnsupportedOperationException — если реализация Process не поддерживает эту операцию
С версии:
9

children

public Stream<ProcessHandle> children()
Возвращает снимок непосредственных дочерних процессов. Родителем непосредственного дочернего процесса является данный процесс. Как правило, у процесса, который не работает, нет дочерних процессов.

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

Требования к реализации:
Эта реализация возвращает непосредственные дочерние процессы с помощью: toHandle().children().
Возвращает:
последовательный Stream объектов ProcessHandle для процессов, являющихся непосредственными дочерними процессами данного процесса
Выбрасывает:
UnsupportedOperationException — если реализация Process не поддерживает эту операцию
С версии:
9

descendants

public Stream<ProcessHandle> descendants()
Возвращает снимок всех потомков процесса. Потомки процесса — это его дочерние процессы и потомки этих дочерних процессов, рекурсивно. Как правило, у процесса, который не работает, нет дочерних процессов.

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

Требования к реализации:
Эта реализация возвращает всех потомков с помощью: toHandle().descendants().
Возвращает:
последовательный Stream объектов ProcessHandle для процессов, являющихся потомками данного процесса
Выбрасывает:
UnsupportedOperationException — если реализация Process не поддерживает эту операцию
С версии:
9

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе документации Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

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