web-dev-qa-db-fra.com

Comment attendre la fin d'un thread avant qu'un autre thread ne démarre en Java / Android?

Disons que j'ai ce code très simple:

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 
} 

Cependant, dans ce code, le thread démarre apparemment 10 fois à la fois et il n'attend pas avant que le précédent ne soit terminé. Comment vérifiez-vous si le fil est terminé avant de le laisser recommencer?

19
ZimZim

Avant de répondre à votre question, je vous encourage fortement à examiner ExecutorServices comme par exemple le ThreadPoolExecutor .

Maintenant, pour répondre à votre question:

Si vous souhaitez attendre la fin du thread précédent, avant de commencer le suivant, vous ajoutez thread.join() entre les deux:

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 

    thread.join();    // Wait for it to finish.
}

Si vous voulez lancer 10 threads, laissez-les faire leur travail, puis continuez, vous join sur eux après la boucle:

Thread[] threads = new Thread[10];
for(int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(this); 
    threads[i].start(); 
}

// Wait for all of the threads to finish.
for (Thread thread : threads)
    thread.join();
32
aioobe

Si chaque thread doit attendre que le précédent se termine avant de commencer, vous feriez mieux d'avoir un thread unique exécutant la méthode d'exécution d'origine 10 fois de suite:

Runnable r = new Runnable() {
    public void run() {
        for (int i = 0; i < 10; i++) {
            OuterClass.this.run();
        }
    }
}
new Thread(r).start();
11
JB Nizet

Juste pour développer la suggestion d'Aioobe:

Avant de répondre à votre question, je vous encourage fortement à examiner les ExecutorServices comme par exemple le ThreadPoolExecutor.

Il existe un ExecutorService particulier qui peut être utilisé pour cette tâche:

ExecutorService pool = Executors.newSingleThreadExecutor();
for (int i=0; i<10; i++) {
  pool.submit(this); //assuming this is a Runnable
}
pool.shutdown(); //no more tasks can be submitted, running tasks are not interrupted

newSingleThreadExecutor() est similaire à l'appel de newFixedThreadPool(1) mais garantit que le service ne peut pas être reconfiguré pour utiliser plusieurs threads.

2
crnv