2009-05-13 16 views
3

Ant Java task fournit le paramètre fork qui, par définition "si activé, déclenche l'exécution de la classe dans une autre machine virtuelle". Comme nous traitons une grande quantité de données, la définition de ce paramètre nous a évité de manquer d'espace de tas Java.
Nous voulons être en mesure de faire la même chose à travers une classe Java. Quel serait le meilleur moyen d'atteindre les fonctionnalités fournies par fork?Java équivalent de fork dans la tâche Java de Ant?

+0

Si tout ce dont vous avez besoin est plus de tas que d'envisager d'utiliser les options -Xmx et -Xms lors du lancement de l'application. votre application Peut-être que vous n'avez pas besoin de plusieurs processus, juste plus de mémoire en premier lieu. Il y a un avantage supplémentaire au sein de la même JVM, vous pouvez utiliser des threads et des primitives de concurrence. – basszero

+0

Droite. Nous avons essayé cela en réglant le Xms et Xmx à différentes valeurs, mais cela n'a pas aidé. Le programme s'est finalement écrasé après avoir fonctionné pendant des durées différentes, en fonction des valeurs définies. Apparemment, cela a à voir avec la mémoire, mais nous n'avons jamais été confrontés quand nous l'avons appelé via Ant (avec fourchette). – pugmarx

Répondre

8

Exécuter un autre processus Java. En utilisant la classe ProcessBuilder, par exemple.

http://java.sun.com/javase/6/docs/api/java/lang/ProcessBuilder.html

Vous pouvez exécuter autant de processus de travail que vous le souhaitez. Faites-leur une classe principale distincte, exécutez leurs tâches à partir de cette classe principale et quittez leur tâche une fois leur tâche terminée.

Vous devrez trouver leur chemin de classe, et l'emplacement de binaire java sur le système, mais c'est faisable.

Je pense que vous pouvez même être averti quand ils complètent via Process.waitFor().

+0

Je pense que ce serait dans la même machine virtuelle, cependant. –

+4

Non, si vous exécutez un Process, c'est la VM différente. Deux processus différents ne peuvent pas partager une machine virtuelle par quelque moyen que ce soit. – alamar

0

Je pense que vous pouvez directement utiliser l'API Ant ... Ant peut être directement utilisé dans une classe Java. Le Javadoc est disponible dans leur distribution binaire.

3

Si vous regardez le code source ant, quand fork est true, il enveloppe juste une tâche Execute et éventuellement, le code qui est appelé est

Runtime.getRuntime().exec(cmd, env); 

Téléchargement et avoir un regard sur le code source