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?
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();
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();
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.