web-dev-qa-db-fra.com

Comment faire fonctionner un fil séparément du fil principal en Java?

L'objectif est de pouvoir invoquer l'exécution d'un thread séparé de la classe principale .

Un certain contexte: j'ai un programme qui doit exécuter un processus . Le processus (un cmd one) ne doit fonctionner que lorsque le programme principal est effectué et est déchargé de la mémoire.

Quel code dois-je inclure dans la classe principale ?

16
helpmepls

Si vous voulez dire: Comment puis-je démarrer un fil Java qui ne se terminera pas lorsque mon JVM (programme Java) fait? .

The answer is: you can't do that.

Parce qu'en Java, si la JVM sort, tous les threads sont terminés. Ceci est un exemple:

class MyRunnable implements Runnable { 
   public void run() { 
       while ( true ) { 
           doThisVeryImportantThing(); 
       } 
   } 
} 

Le programme ci-dessus peut être démarré à partir de votre fil principal par exemple, ce code:

MyRunnable myRunnable = new MyRunnable(); 
Thread myThread = new Thread(myRunnable);
myThread.start(); 

Cet exemple de programme n'arrêtera jamais, à moins que quelque chose dans doThisVeryImportantThing _ finira ce fil. Vous pourriez l'exécuter comme un démon, comme dans cet exemple:

MyRunnable myRunnable = new MyRunnable(); 
Thread myThread = new Thread(myRunnable);
myThread.setDaemon(true); // important, otherwise JVM does not exit at end of main()
myThread.start(); 

Cela s'assurera, si le fil principal () se termine, il terminera également myThread.

Vous pouvez toutefois démarrer un JVM différent de Java, car vous voudrez peut-être consulter cette question: lancez JVM Process à partir d'un Java Application Utilisez runtime.exec?

33
Kdeveloper

Je ne suis pas tout à fait sûr que vous pouvez faire un thread "détaché" dans Java à l'aide des moyens normaux de mise en œuvre de la mise en œuvre et de la frapper avec exécution ().

Vous devrez peut-être avoir besoin de fourchette un fil à l'aide de Runtime.exec(), exécutant Java comme processus totalement séparé, pas comme un fil.

0
Tony Ennis

Pour reproduire un processus qui survit après la fin de la JVM, vous devez utiliser Runtime.exec(). Depuis que vous voulez que cela fonctionne après la fin du processus principal, vous pouvez vraiment le faire:

1) Si vous souhaitez uniquement traiter pour fonctionner lors d'un arrêt propre, vous pouvez le faire:

public static void main(String[] args) {
    doThisProgramsStuff();
    spawnSecondProcess();
}

2) Ou, si vous voulez que le processus fonctionne même avec un arrêt impur (ou s'il s'agit d'une application d'interface graphique), vous pouvez ajouter un crochet d'arrêt:

public static void main(String[] args) {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            spawnSecondProcess();
        }
    });
    doThisProgramsStuff();
}

Il y a cependant un problème avec tout cela. Une fois que la JVM termine le processus d'enfant aura une entrée/sortie standard attachée à rien, il peut donc remplir ses tampons de sortie et bloquer. Vous devrez faire quelque chose pour vous assurer que cela ne se produit pas en vous assurant que le processus ne produit pas de sortie à ces flux ou en faisant l'équivalent Windows de redirection de/dev/null.

0
Cameron Skinner

On dirait que vous voulez un script qui appelle le premier programme, puis lorsque la première finition, elle appelle le deuxième programme.

Quelque chose comme

program1
program2

EDIT: Pour exécuter les deux tâches en parallèle, vous pouvez faire

program1 &
program2

dans une coque Bash/unité.

ou dans DOS Shell

start program1
program2
0
Peter Lawrey