Класс 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 |
children() |
Возвращает снимок непосредственных дочерних процессов. |
void |
close() |
Закрывает все потоки чтения и записи и ожидает завершения процесса. |
Stream |
descendants() |
Возвращает снимок потомков процесса. |
abstract void |
destroy() |
Завершает процесс. |
Process |
destroyForcibly() |
Принудительно завершает процесс. |
final BufferedReader |
errorReader() |
Возвращает BufferedReader, подключенный к стандартному потоку ошибок процесса. |
final BufferedReader |
errorReader |
Возвращает BufferedReader, подключенный к стандартному потоку ошибок этого процесса и использующий Charset. |
abstract int |
exitValue() |
Возвращает код завершения процесса. |
abstract InputStream |
getErrorStream() |
Возвращает входной поток, подключенный к потоку ошибок процесса. |
abstract InputStream |
getInputStream() |
Возвращает входной поток, подключенный к стандартному потоку вывода процесса. |
abstract OutputStream |
getOutputStream() |
Возвращает выходной поток, подключенный к стандартному потоку ввода процесса. |
ProcessHandle.Info |
info() |
Возвращает снимок сведений о процессе. |
final BufferedReader |
inputReader() |
Возвращает BufferedReader, подключенный к стандартному потоку вывода процесса. |
final BufferedReader |
inputReader |
Возвращает BufferedReader, подключенный к стандартному потоку вывода этого процесса и использующий Charset. |
boolean |
isAlive() |
Проверяет, выполняется ли процесс, представленный этим Process. |
CompletableFuture |
onExit() |
Возвращает CompletableFuture<Process>, связанный с завершением Process. |
final BufferedWriter |
outputWriter() |
Возвращает BufferedWriter, подключенный к стандартному потоку ввода процесса и использующий нативную кодировку. |
final BufferedWriter |
outputWriter |
Возвращает BufferedWriter, подключенный к стандартному потоку ввода процесса и использующий Charset. |
long |
pid() |
Возвращает нативный идентификатор процесса. |
boolean |
supportsNormalTermination() |
Возвращает true, если реализация destroy() предусматривает обычное завершение процесса; возвращает false, если реализация destroy принудительно и немедленно завершает процесс. |
ProcessHandle |
toHandle() |
Возвращает ProcessHandle для Process. |
abstract int |
waitFor() |
При необходимости заставляет текущий поток ожидать завершения процесса, представленного этим объектом Process. |
boolean |
waitFor |
При необходимости заставляет текущий поток ожидать завершения процесса, представленного этим объектом Process, или истечения указанного времени ожидания. |
boolean |
waitFor |
При необходимости заставляет текущий поток ожидать завершения процесса, представленного этим объектом Process, или истечения указанной продолжительности ожидания. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Показывает, равен ли другой объект этому объекту. |
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 |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо истечения заданного промежутка реального времени. |
Подробное описание конструкторов
Process
public 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()
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
© 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.