1. Создание процесса Java
Java предоставляет два метода для запуска процесса или другой программы:
(1) Используйте метод exec (2) exec (2) Используйте метод processbuilder () Method (2)
1.1 ProcessBuilder
Класс процессов - это новый класс, недавно добавленный в Java.lang от J2SE 1.5. Перед J2SE 1.5 управление процессами и управление были реализованы классом процесса.
Каждый экземпляр процессора построения управляет набором свойств процесса. Метод start () использует эти свойства для создания нового экземпляра процесса. Метод start () может быть вызван многократно из того же экземпляра, чтобы создать новый дочерний процесс с теми же или связанными свойствами.
Каждый генератор процессов управляет этими свойствами процесса:
Команда - это список строк, которые представляют внешний файл программы, который можно вызвать, и его параметры (если есть). Здесь список строк, представляющих действительные команды операционной системы, зависит от системы. Например, каждая общая переменная обычно становится элементом в этом списке, но существуют операционные системы, которые хотят, чтобы программа отмечала сами строки командной строки - в таких системах реализации Java могут потребовать, чтобы команды включали именно эти два элемента.
Среда представляют собой системные отображения от переменных до значений. Начальное значение - это копия текущей среды процесса (см. System.getenv ()).
Рабочий каталог. Значением по умолчанию является текущий рабочий каталог текущего процесса, обычно называемый в соответствии с системой user user.dir.
RedirecterrorStream собственность. Первоначально это свойство является ложным, что означает, что стандартный выходной сигнал и выходной сигнал и вывод ошибок дочернего процесса отправляются двум независимым потокам, к которым можно получить доступ через методы Process.getInputStream () и Process.getErrorStream (). Если значение установлено в True, стандартная ошибка объединяется со стандартным выводом. Это облегчает связь сообщений об ошибках и соответствующий вывод. В этом случае объединенные данные могут быть считываются из потока, возвращаемого Process.getInputStream (), в то время как поток считывается из Process.getErrorsTream (), достигнут непосредственно конец файла.
Изменение свойств процесса -строителя повлияет на последующие процессы, запускаемые методом начала () объекта, но никогда не повлияет на ранее запускаемые процессы или саму Java. Большинство проверок ошибок выполняется методом start (). Состояние объекта может быть изменено, но start () потерпит неудачу таким образом. Например, установка свойства команды в пустой список не будет выбросить исключение, если не будет включено start ().
Обратите внимание, что этот класс не является синхронным. Если несколько потоков получают доступ к процессу строителя одновременно, и, по крайней мере, один из потоков структурно изменяет одно из свойств, он должен сохранять внешнюю синхронизацию.
Сводка методов строительства
ProcessBuilder (список <string> команда)
Построить генератор процессов, используя указанные программы и параметры операционной системы.
ProcessBuilder (строка ... Команда)
Построить генератор процессов, используя указанные программы и параметры операционной системы.
Сводка метода
Список <string> command ()
Возвращает программы операционной системы и параметры этого генератора процессов.
Команда ProcessBuilder (список <string> команда)
Устанавливает программы операционной системы и параметры этого генератора процессов.
Команда процесса построения (строка ... Команда)
Устанавливает программы операционной системы и параметры этого генератора процессов.
File Directory ()
Возвращает рабочий каталог этого генератора процессов.
Справочник ProcessBuilder (файловый каталог)
Устанавливает рабочий каталог для этого генератора процессов.
Map <String, String> Environment ()
Возвращает представление со отображением строки этой среды генератора процессов.
Boolean RedirecterrorStream ()
Уведомите генератор процессов, объединять стандартные ошибки и стандартный выход.
ProcessBuilder RedIrecterRorStream (Boolean RedireCterrorStream)
Устанавливает свойство RedireCterRorStream этого генератора процессов.
Процесс начал ()
Запустите новый процесс, используя свойства этого генератора процесса.
1.2 Средство выполнения
Каждое Java -приложение имеет экземпляр класса времени выполнения, что позволяет приложению подключаться к среде, которое она работает. Текущее время выполнения может быть получено с помощью метода GetRuntime.
Приложения не могут создавать свои собственные экземпляры класса времени выполнения. Тем не менее, вы можете использовать метод GetRuntime, чтобы получить ссылку на текущий объект времени выполнения выполнения. Как только вы получите ссылку на текущий объект времени выполнения, вы можете вызвать метод объекта выполнения, чтобы управлять состоянием и поведением виртуальной машины Java.
Код сбора кодов Java
void AddShutDownHook (крючок потока)
Зарегистрируйте новую виртуальную машину, чтобы выключить крючок.
int avouted processors ()
Возвращает количество доступных процессоров на виртуальную машину Java.
Process Exec (String Command)
Выполните указанную строку команду в отдельном процессе.
Process Exec (String [] cmdarray)
Выполните указанные команды и переменные в отдельном процессе.
Process Exec (String [] cmdarray, String [] envp)
Выполнить указанные команды и переменные в отдельном процессе указанной среды.
Process Exec (String [] cmdarray, String [] envp, файл dir)
Выполните указанные команды и переменные в отдельных процессах в указанной среде и рабочем каталоге.
Process Exec (String Command, String [] envp)
Выполните указанную строковую команду в отдельном процессе указанной среды.
Process Exec (String Command, String [] envp, файл dir)
Выполните указанную строку команду в отдельном процессе с указанной средой и рабочим каталогом.
void exit (int status)
Прекратите в настоящее время работающую виртуальную машину Java, запустив последовательность выключения виртуальной машины.
Длинная свобода ()
Возвращает объем свободной памяти в виртуальной машине Java.
void GC ()
Запустите коллектор мусора.
InputStream getLocalizedInputStream (inputStream in)
Устаревший. Начиная с JDK 1.1, предпочтительным методом преобразования локально кодированного байтового потока в поток символов Unicode является использование классов InputStreamReader и BufferedReader.
OutputStream getLocalizedOutputStream (outputStream Out)
Устаревший. Начиная с JDK 1.1, предпочтительным методом преобразования потока символов Unicode в локально кодированный байтовый поток является использование классов OutputStreamWriter, BufferedWriter и PrintWriter.
Статическое время выполнения getRuntime ()
Возвращает объект времени выполнения, связанный с текущим приложением Java.
void остановите (int status)
Принудительное прекращение в настоящее время работает на виртуальной машине Java.
void нагрузка (String Filename)
Загружает указанное имя файла в качестве динамической библиотеки.
void loadlibrary (строка libname)
Загружает динамическую библиотеку с указанным именем библиотеки.
Long MaxMemory ()
Возвращает максимальный объем памяти, который пытается использовать виртуальная машина Java.
Boolean removeshutdownhook (Thread Hook)
Не регистрируйте ранее зарегистрированную виртуальную машину, чтобы выключить крючок.
void runfinalization ()
Запускает метод завершения всех объектов, которые приостанавливают завершение завершения.
static void runfinalizersonexit (логическое значение)
Устаревший. Сам этот метод небезопасен. Он может вызвать окончательный метод используемого объекта, в то время как другие потоки работают на этих объектах, что приводит к неправильному поведению или тупикам.
длинная общая память ()
Возвращает общий объем памяти в виртуальной машине Java.
void traceinstructions (логические
Включить/отключить отслеживание команды.
void tracemethodcalls (логический
Включить/отключить отслеживание вызова метода.
1.3 Процесс
Независимо от того, какой метод используется для запуска процесса, экземпляр класса процесса представляет собой начальный процесс, который будет возвращен, который можно использовать для управления процессом и получения соответствующей информации. Класс процесса предоставляет методы для выполнения от ввода процесса, вывода выполнения для обработки, ожидания завершения процесса, проверьте состояние выхода процесса и уничтожить (убийство) процесс:
void destress ()
Убейте дочернего процесса.
Вообще говоря, этот метод не может убить процесс, который был запущен, поэтому лучше не использовать его.
int exitValue ()
Возвращает значение выхода дочернего процесса.
Метод exitValue () будет иметь нормальное возвратное значение только после того, как процесс запуска завершил свое выполнение или выходит из -за исключения, в противном случае будет выброшено исключение.
InputStream geterRorStream ()
Получает поток ошибок дочернего процесса.
Если вывод ошибки перенаправлен, выходной выход не может быть считан из потока.
InputStream getInputStream ()
Получает входной поток дочернего процесса.
Стандартный выход процесса может быть прочитал из этого потока.
OutputStream getOutputStream ()
Получает выходной поток дочернего процесса.
Данные, записанные в потоку, используются в качестве стандартного ввода в процесс.
int waitfor ()
Приводит к тому, что текущий поток ожидает, если это необходимо, до тех пор, пока процесс, представленный объектом процесса, не завершится.
2. Примеры многопроцессного программирования
Как правило, когда мы запускаем методы в других классах в Java, независимо от того, являются ли они статическими или динамичными вызовами, они выполняются в текущем процессе, то есть есть только один экземпляр Java Virtual Machine. Иногда нам нужно запустить несколько подпроцессов Java через код Java. Хотя это занимает некоторые системные ресурсы, это сделает программу более стабильной, потому что вновь запущенная программа работает в различных процессах виртуальных машин.
В Java мы можем использовать два метода для достижения этого требования. Самый простой способ - выполнить Java ClassName с помощью метода EXEC во время выполнения. Если выполнение успешно, этот метод возвращает объект процесса. Давайте посмотрим на простой пример ниже.
// test1.java -файл импорт java.io.*; ; exec ("Java test1");После запуска программы через Java test_exec я обнаружил, что на дисков C был дополнительный файл test1.txt, но в консоли не появилась информация о выводе «успешно!» Следовательно, можно сделать вывод, что тест был успешно выполнен, но по какой -то причине выходная информация о тесте не выводится в консоли test_exec. Эта причина также очень проста, потому что дочерний процесс test_exec создается с помощью EXEC.
Если вы хотите вывести выходную информацию о детском процессе, вы можете получить выходной поток дочернего процесса через процесс GetInputStream (вывод в детском процессе, вход в родительский процесс), а затем перенести выходной поток ребенка Процесс из вывода консоли родительского процесса. Конкретный код реализации выглядит следующим образом:
// test_exec_out.javaimport java.io.*; Открытый класс test_exec_out {public static void main (string [] args) {runtime run = runtime.getruntime (); = Новый BufferedInputStream (P.GetInputStream ()); ;Как видно из приведенного выше кода, в TEST_EXEC_OUT.JAVA выходная информация о дочернем процессе читается по строке, а затем выход выполняется на каждой строке в TEST_EXEC_OUT. Приведенное выше обсуждение - как получить выходную информацию о детском процессе. Затем, в дополнение к выходной информации, есть также входная информация. Поскольку дочерний процесс не имеет собственной консоли, входная информация также должна быть предоставлена родительским процессом. Мы можем предоставить входную информацию в процесс ребенка с помощью метода процесса GetOutputStream (то есть входная информация от родительского процесса в процесс ребенка, а не входную информацию из консоли). Мы можем посмотреть на следующий код:
// test2.java -файл Импорт java.io.*; «Информация, введенная родительским процессом:« + br.readline ()); .getruntime (); flush ();
Из приведенного выше кода мы видим, что Test1 получает информацию, отправленную TEST_EXEC_IN и выводит ее. Когда вы не добавляете bw.flash () и bw.close (), информация не достигнет дочернего процесса, что означает, что дочерний процесс входит в состояние блокировки, но после выхода родительского процесса, дочерний процесс также выходит Полем Если вы хотите доказать это, вы можете добавить System.in.read () в конце, а затем просмотреть процесс Java через диспетчер задач (под Windows), и вы обнаружите, что если вы добавите bw.flush () и bw .close (), существует только один процесс Java, если они удалены, существуют два процесса Java. Это связано с тем, что если информация передается в Test2, Test2 выходит после получения информации. Вот одна вещь, которую нужно объяснить, что выполнение EXEC является асинхронным и не перестанет выполнять следующий код, потому что выполняется определенная программа, которая заблокирована. Следовательно, после запуска тестирования2 можно выполнить следующий код.
Метод EXEC был перезагрузен много раз. То, что используется выше, это просто перегрузка этого. Он также может отделять команды и параметры, такие как Exec ("java.test2"), может быть записано как exec ("java", "test2"). Exec также может запускать виртуальные машины Java с различными конфигурациями с помощью указанных переменных среды.
В дополнение к использованию метода EXEC Runtime для создания дочернего процесса, вы также можете построить дочерний процесс через процесс Scuilder. Использование процесса построения следующего:
// test_exec_out.javaimport java.io.*; Public class test_exec_out {public static void main (string [] args) {processbuilder pb = new Processbui lder ("java", "test1"); ;При установлении дочерних процессов процесс -застройка аналогична времени выполнения, используя метод start () для запуска дочернего процесса, в то время как выполнение использует метод EXEC. После получения процесса их операции точно такие же.
Как и во время выполнения, процесс -заработок также может установить информацию о среде, рабочий каталог и т. Д. Выполняемый файл. В следующем примере описывается, как установить эту информацию, используя процесс строителя.
ProcessBuilder pb = new ProcessBuilder ("command", "arg2", "arg2", '' ''); // Установить переменную среду map <string, string> env = pb.environment (); env.put ("key1", ::::::::::::::::: ::::::::::::::::: ::::::::::::::::::::::::::::: :::: "" value1 "); env.remove (" key2 "); env.put (" key2 ", env . Get ("key1") + "_test");