1.Creation of Java Process
Java proporciona dos métodos para comenzar un proceso u otro programa:
(1) Use el método EXEC () de Runtime (2) Use el método Start () de inicio (2) de ProcessBuilder (2)
1.1 ProcessBuilder
La clase ProcessBuilder es una nueva clase recién agregada en Java.lang por J2SE 1.5 se utiliza para crear procesos del sistema operativo. Antes de J2SE 1.5, la clase de proceso implementó el control y la gestión del proceso.
Cada instancia de ProcessBuilder gestiona un conjunto de propiedades del proceso. El método Start () utiliza estas propiedades para crear una nueva instancia de proceso. El método Start () se puede llamar repetidamente desde la misma instancia para crear un nuevo proceso infantil con las mismas o propiedades relacionadas.
Cada generador de procesos administra estas propiedades del proceso:
Un comando es una lista de cadenas que representan el archivo de programa externo a llamar y sus parámetros (si los hay). Aquí, la lista de cadenas que representan comandos de sistema operativo válidos dependen del sistema. Por ejemplo, cada variable general generalmente se convierte en un elemento en esta lista, pero hay sistemas operativos que desean que el programa marque las cadenas de línea de comandos: en tales sistemas, las implementaciones de Java pueden requerir que los comandos incluyan exactamente estos dos elementos.
Los entornos son asignaciones dependientes del sistema de variables a valores. El valor inicial es una copia del entorno de proceso actual (ver System.getenv ()).
Directorio de trabajo. El valor predeterminado es el directorio de trabajo actual del proceso actual, generalmente nombrado de acuerdo con la propiedad del sistema user.dir.
Propiedad RedirectterrorStream. Inicialmente, esta propiedad es falsa, lo que significa que la salida estándar y la salida de error del proceso infantil se envían a dos secuencias independientes a las que se puede acceder a través del proceso. Si el valor se establece en True, el error estándar se fusiona con la salida estándar. Esto hace que sea más fácil asociar los mensajes de error y la salida correspondiente. En este caso, los datos fusionados se pueden leer desde la transmisión devuelta por Process.getInputStream (), mientras que la transmisión leída de Process.getErrorStream () llegará al final del archivo directamente.
La modificación de las propiedades del constructor de procesos afectará los procesos posteriores iniciados por el método Start () del objeto, pero nunca afectará los procesos iniciados previamente o Java. La mayoría de las verificaciones de errores se realizan mediante el método Start (). El estado del objeto puede modificarse, pero comenzar () fallará de esta manera. Por ejemplo, configurar la propiedad de comando en una lista vacía no lanzará una excepción a menos que se incluya Start ().
Tenga en cuenta que esta clase no es sincrónica. Si múltiples hilos acceden a un proceso de proceso al mismo tiempo, y al menos uno de los hilos modifica estructuralmente una de las propiedades, debe mantener la sincronización externa.
Resumen de métodos de construcción
ProcessBuilder (list <string> comando)
Construya un generador de procesos utilizando programas y parámetros del sistema operativo especificados.
ProcessBuilder (String ... comando)
Construya un generador de procesos utilizando programas y parámetros del sistema operativo especificados.
Resumen de métodos
Lista <String> Command ()
Devuelve los programas y parámetros del sistema operativo de este generador de procesos.
Comando ProcessBuilder (list <string> comando)
Establece los programas y parámetros del sistema operativo de este generador de procesos.
Comando ProcessBuilder (String ... comando)
Establece los programas y parámetros del sistema operativo de este generador de procesos.
Directorio de archivos ()
Devuelve el directorio de trabajo de este generador de procesos.
Directorio de ProcessBuilder (directorio de archivos)
Establece el directorio de trabajo para este generador de procesos.
MAP <String, String> Environment ()
Devuelve una vista de mapeo de cadenas de este entorno del generador de procesos.
boolean redirectterrorStream ()
Notifique al generador de procesos si se debe fusionar errores estándar y salida estándar.
ProcessBuilder redirectterrorStream (boolean redirectterrorRtors)
Establece la propiedad redirectterRorRream de este generador de procesos.
Process Start ()
Inicie un nuevo proceso utilizando las propiedades de este generador de proceso.
1.2 Tiempo de ejecución
Cada aplicación Java tiene una instancia de clase de ejecución, lo que permite que la aplicación se conecte al entorno que ejecuta. El tiempo de ejecución actual se puede obtener a través del método GetRuntime.
Las aplicaciones no pueden crear sus propias instancias de clase de tiempo de ejecución. Sin embargo, puede usar el método GetRuntime para obtener la referencia al objeto de tiempo de ejecución actual. Una vez que obtenga una referencia al objeto de tiempo de ejecución actual, puede llamar al método del objeto de tiempo de ejecución para controlar el estado y el comportamiento de la máquina virtual Java.
Código de recopilación de código Java
Vacío Addshutdownhook (gancho de hilo)
Registre una nueva máquina virtual para apagar el gancho.
int disponible
Devuelve el número de procesadores disponibles a la máquina virtual Java.
Process Exec (comando de cadena)
Ejecute el comando de cadena especificado en un proceso separado.
Process Exec (String [] cmdArray)
Ejecutar comandos y variables especificadas en un proceso separado.
Process Exec (String [] cmdarray, string [] envp)
Ejecutar comandos y variables especificadas en un proceso separado del entorno especificado.
Process Exec (String [] cmdarray, string [] envp, archivo dir)
Ejecutar comandos y variables especificadas en procesos separados en el entorno especificado y el directorio de trabajo.
Process Exec (String Command, String [] Envp)
Ejecute el comando de cadena especificado en un proceso separado del entorno especificado.
Process Exec (String Command, String [] Envp, File Dir)
Ejecute el comando de cadena especificado en un proceso separado con un entorno especificado y un directorio de trabajo.
Salida vacía (estado int)
Termine la máquina virtual Java actualmente en ejecución iniciando la secuencia de cierre de la máquina virtual.
Long Freememory ()
Devuelve la cantidad de memoria gratuita en la máquina virtual Java.
vacío GC ()
Ejecute el recolector de basura.
InputStream getLocalizedInputStream (InputStream in)
Obsoleto. Comenzando con JDK 1.1, el método preferido para convertir una transmisión de byte codificada localmente a una secuencia de caracteres Unicode es usar las clases InputStreamReader y BufferedReader.
OutputStream getLocalizeToutPutStream (outputStream Out)
Obsoleto. Comenzando con JDK 1.1, el método preferido para convertir una secuencia de caracteres Unicode a una secuencia de bytes codificada localmente es usar las clases OutputStreamWriter, BufferedWriter y PrintWriter.
tiempo de ejecución estática getruntime ()
Devuelve el objeto de tiempo de ejecución asociado con la aplicación Java actual.
Halt nulo (estado int)
FORCED Termine la máquina virtual Java que funciona actualmente.
carga nula (nombre de archivo de cadena)
Carga el nombre del archivo especificado como la biblioteca dinámica.
void loadLibrary (Libname de cadena)
Carga una biblioteca dinámica con el nombre de la biblioteca especificado.
Long MaxMemory ()
Devuelve la cantidad máxima de memoria que la máquina virtual Java intenta usar.
Boolean RemoveShutdownhook (Hilo Hook)
Un registro de una máquina virtual previamente registrada para apagar el gancho.
runfinalización vacía ()
Ejecuta el método de terminación de todos los objetos que suspenden la finalización.
Vacío estático RunFinalizerSonexit (valor booleano)
Obsoleto. Este método en sí es inseguro. Puede llamar a un método final en el objeto que se usa, mientras que otros hilos están operando en esos objetos, lo que resulta en un comportamiento incorrecto o un punto muerto.
largo TotalMemory ()
Devuelve la cantidad total de memoria en la máquina virtual Java.
Traceinstrucciones vacías (booleano en)
Habilitar/deshabilitar el seguimiento de comandos.
tracemetodcalls nulo (booleano en)
Activar/deshabilitar el seguimiento de llamadas del método.
1.3 Proceso
No importa qué método se utilice para iniciar el proceso, se devolverá una instancia de la clase de proceso representa el proceso iniciado, que se puede utilizar para controlar el proceso y obtener información relevante. La clase de proceso proporciona métodos para ejecutar desde la entrada del proceso, la salida de ejecución al proceso, esperar la finalización del proceso, verificar el estado de salida del proceso y destruir (matar) el proceso:
Vacío de destrucción ()
Mata el proceso infantil.
En términos generales, este método no puede matar el proceso que se ha iniciado, por lo que es mejor no usarlo.
int ExitValue ()
Devuelve el valor de salida del proceso infantil.
El método ExitValue () tendrá un valor de retorno normal solo después de que el proceso de inicio haya completado su ejecución o salga debido a una excepción, de lo contrario se lanzará una excepción.
InputStream getErrorStream ()
Obtiene el flujo de error del proceso infantil.
Si se redirige la salida de error, la salida de error no se puede leer desde la secuencia.
InputStream getInputStream ()
Obtiene el flujo de entrada del proceso infantil.
La salida estándar del proceso se puede leer de esta secuencia.
OutputStream getOutputStream ()
Obtiene el flujo de salida del proceso infantil.
Los datos escritos en la secuencia se utilizan como entrada estándar al proceso.
int waitfor ()
Hace que el hilo actual espere, si es necesario, hasta que el proceso representado por el objeto de proceso haya terminado.
2. Ejemplos de programación multiproceso
En general, cuando ejecutamos métodos en otras clases en Java, ya sean llamadas estáticas o dinámicas, se ejecutan en el proceso actual, es decir, solo hay una instancia de máquina virtual Java en ejecución. A veces, necesitamos iniciar múltiples subprocesos Java a través del código Java. Aunque hacer esto ocupa algunos recursos del sistema, hará que el programa sea más estable porque el programa recién iniciado se ejecuta en diferentes procesos de máquina virtual.
En Java podemos usar dos métodos para lograr este requisito. La forma más fácil es ejecutar Java ClassName a través del método EXEC en tiempo de ejecución. Si la ejecución es exitosa, este método devuelve un objeto de proceso. Echemos un vistazo a un simple ejemplo a continuación.
// test1.java File Import Java.io.*; Public Class Test {public static void main (string [] args) {fileOutputStream fout = new FileOutputStream ("c: // test1 .txt"); ; ejecutivo ("Java test1");Después de ejecutar el programa a través de Java Test_Exec, descubrí que había un archivo test1.txt adicional en la unidad C, pero la información de salida "se llama correctamente!" Por lo tanto, se puede concluir que la prueba se ha ejecutado con éxito, pero por alguna razón, la información de salida de la prueba no se produce en la consola de test_exec. Esta razón también es muy simple, porque el proceso infantil de Test_Exec se crea usando Exec.
Si desea obtener la información de salida del proceso infantil, puede obtener la secuencia de salida del proceso infantil a través de getInputStream en proceso (salida en el proceso del niño, entrada en el proceso principal) y luego transferir la secuencia de salida del niño Proceso desde la salida de la consola del proceso principal. El código de implementación específico es el siguiente:
// test_exec_out.javaimport java.io.*; Public class test_exec_out {public static void main (string [] args) {runtime run = runtime.getRuntime (); = New BufferedInputStream (P.GetInputStream ()); ;Como se puede ver en el código anterior, en test_exec_out.java, la información de salida del proceso infantil se lee por fila, y luego la salida se realiza en cada línea en test_exec_out. La discusión anterior es cómo obtener la información de salida del proceso infantil. Luego, además de la información de salida, también hay información de entrada. Dado que el proceso infantil no tiene su propia consola, la información de entrada también debe ser proporcionada por el proceso principal. Podemos proporcionar información de entrada al proceso del niño a través del método de proceso GetOutputStream (es decir, información de entrada del proceso principal al proceso del niño, en lugar de la información de entrada de la consola). Podemos ver el siguiente código:
// test2.java File Import Java.io.*; Public Class Test {public static void main (string [] args) {bufferedReader br = new BufferedReader (New InputStreamread ER (System.in)); "Información ingresada por el proceso principal:" + br.readline ()); .getRunTime (); FLUSH () En el código anterior, podemos ver que Test1 obtiene la información enviada por test_exec_in y la genera. Cuando no agrega bw.flash () y bw.close (), la información no alcanzará el proceso infantil, lo que significa que el proceso infantil ingresa a un estado de bloqueo, pero dado que el proceso principal ha salido, el proceso infantil también sale . Si desea probar esto, puede agregar System.in.Read () al final y luego ver el proceso Java a través del Administrador de tareas (en Windows), y lo encontrará si agrega BW.Flush () y BW .Close (), solo existe un proceso de Java, si se eliminan, existen dos procesos Java. Esto se debe a que si la información se pasa a Test2, Test2 sale después de obtener la información. Aquí hay una cosa que se explica que la ejecución de Exec es asíncrona y no dejará de ejecutar el siguiente código porque un determinado programa que se ejecuta está bloqueado. Por lo tanto, después de ejecutar Test2, el siguiente código aún se puede ejecutar.
El método EXEC ha sido recargado muchas veces. Lo que se usa anteriormente es solo una sobrecarga de ello. También puede separar comandos y parámetros, como Exec ("java.test2") se puede escribir como ejecutor ("java", "test2"). EXEC también puede ejecutar máquinas virtuales Java con diferentes configuraciones a través de variables de entorno especificadas.
Además de usar el método EXECTime de Runtime para construir un proceso infantil, también puede construir un proceso infantil a través de ProcessBuilder. El uso de ProcessBuilder es el siguiente:
// test_exec_out.javaimport java.io.*; Public class test_exec_out {public static void main (string [] args) {ProcessBuilder pb = new ProcessBui lder ("java", "test1"); ; ...}}Al establecer procesos infantiles, ProcessBuilder es similar al tiempo de ejecución. Después de obtener el proceso, sus operaciones son exactamente las mismas.
Al igual que el tiempo de ejecución, ProcessBuilder también puede establecer la información del entorno, el directorio de trabajo, etc. del archivo ejecutable. El siguiente ejemplo describe cómo establecer esta información usando ProcessBuilder.
ProcessBuilder pb = new ProcessBuilder ("comando", "arg2", "arg2", '' '); // establecer el mapa variable de entorno <string> env = pb.environment (); env.put ("key1", :::::::::::::::::: para::: ::::::::::::::::::::::::::::::: :::::::::::::::::: para::: ::::::::::::::::::::::::::::::: : ::::::::::::::::::::::::::::::::ingD .get ("key1") + "_test");