Lancer un sous-processus                  

Lancer un sous-processus

Le paquetage java.lang contient la classe Runtime qui modélise l'exécution d'un programme et permet d'interagir avec l'environnement ; à chaque programme qui s'exécute correspond une instance de la classe Runtime. Nous illustrons ci-dessous quelques-unes des méthodes de cette classe.

L'objectif de l'exemple est le suivant (on suppose que l'exécution du programme se fera sous Unix) : donner à l'utilisateur deux indications concernant les ressources en mémoire : la quantité totale de mémoire disponible de la machine virtuelle Java et la quantité de mémoire disponible du système ; faire démarrer un autre programme (un sous-programme) : le programme qui s'exécute quand on envoie la commande java EssaiBoutons ; attendre que ce sous-programme se termine ; exécuter la commande ls, disponible sur la machine utilisée, qui indique sur la sortie standard la liste des fichiers du répertoire courant. La sortie du sous-programme n'est pas automatiquement dirigée sur la sortie du programme, il faut effectuer un traitement particulier. Exemple 18.12. Fichier EssaiRuntime.java

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

class EssaiRuntime {
	public static void main(String[] arg) throws Exception {
		Runtime objetExecution = Runtime.getRuntime();

		System.out.println(objetExecution.totalMemory());

		Process sousProgramme;
		sousProgramme = objetExecution.exec("java Disque");
		sousProgramme.waitFor();

		System.out.println(objetExecution.freeMemory());
		objetExecution.gc();
		System.out.println(objetExecution.freeMemory());

		sousProgramme = objetExecution.exec("ls");
		InputStream i = sousProgramme.getInputStream();
		BufferedReader lecteur = new BufferedReader(new InputStreamReader(i));
		String ligne;
		while ((ligne = lecteur.readLine()) != null)
			System.out.println(ligne);
	}
}
Sachant que le premier fichier du répertoire courant s'appelle Assemble.java, les premières lignes qu'on obtient sur la sortie standard sont :
32178176
31842480
32031200
Assemble.java
...
objetExecution.totalMemory() : renvoie la quantité totale de mémoire disponible sur la machine virtuelle Java sous la forme d'un long. Le résultat dépend de l'environnement sur lequel on travaille.
>Process : cette classe modélise un processus et dispose de quelques méthodes dont une bonne partie est illustrée avec notre exemple.
sousProgramme = objetExecution.exec("java Disque"); : on fait ainsi démarrer un sous-programme correspondant à la commande java Disque ; on pourrait indiquer une autre commande que l'envoi d'un programme Java, par exemple un « exécutable » issu d'un programme C. L'argument de la méthode exec est une chaîne correspondant à une commande et à ses paramètres. D'autres méthodes exec de la classe Runtime peuvent être consultées en ligne.
sousProgramme.waitFor() : fait attendre le programme jusqu'à ce que le sous-programme se termine. Cette instruction est mise ici pour l'illustration mais il n'est pas nécessaire d'attendre la fin de ce sous-programme pour faire débuter un autre sous-programme. On aurait pu aussi, si nécessaire, employer la méthode destroy de la classe Process pour détruire le sous-processus.
objetExecution.freeMemory() : renvoie la quantité de mémoire libre sous la forme d'un long.
objetExecution.gc() : on demande au ramasse-miettes (gc pour garbage collector) de rendre disponible de l'espace en mémoire qui n'est plus référencé. On peut constater sur la sortie du programme que la mémoire libre a augmenté après l'appel à la méthode gc.
sousProgramme.getInputStream() : on effectue un transfert de la sortie standard du sous-programme vers le programme. On peut aussi disposer de la méthode getOutputStream qui effectue un transfert de la sortie standard du programme vers le sous-programme concerné. !
© Irène Charon, Télécom ParisTech 2011