Mon premier thread
Créer un nouveau thread en Java est assez simple. Il suffit d'instancier un nouveau thread, de fournir le code à exécuter et de démarrer le thread :
Thread monPremierThread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Voici mon premier thread");
}
});
monPremierThread.start();
Note
Le code ci-dessus peut être simplifié en utilisant une fonction lambda. Les deux blocs de code donnent un résultat identique.
Lors de l'exécution, un second thread sera lancé et affichera un message.
Exécuter plusieurs threads
Plusieurs threads peuvent être exécutés selon le même principe. Le code s'exécutera alors "en même temps" :
// Premier thread
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("Thread 1 : " + i);
}
});
// Second thread
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("Thread 2 : " + i);
}
});
// Démarrer les threads
thread1.start();
thread2.start();
// Boucler dans le thread principal
for (int i = 0; i < 10; i++) {
System.out.println("Main : " + i);
}
Chaque exécution donnera un résultat différent à la console :
Attendre la fin des threads avant de poursuivre
Une fois un thread lancé, son exécution se fera dans un processus séparé et le code du thread principal pourra continuer à s'exécuter. Il pourrait parfois utile d'attendre la fin d'un thread avant de poursuivre le programme. La méthode join()
sert justement à ça.
Lorsque la méthode join()
est appelée sur un thread, le programme attendra que celui-ci se termine avant de continuer. Par exemple, si on veut télécharger un fichier, attendre la fin du téléchargement avant de quitter l'application peut être utile. Même chose pour déconnecter sa clé USB de l'ordinateur, on doit attendre que les fichiers aient terminés de s'écrire.
Chaque exécution donnera encore une fois un résultat différent, à l'exception que le thread principal devra attendre que les deux threads aient complètement terminés avant de poursuivre. Le code sera bloqué aux instructions join()
.
Interface Runnable
Runnable
est une interface ayant une seule méthode à remplacer : run()
. On peut alors permettre à une classe existante de s'exécuter en tant que thread en lui faisant implémenter l'interface Runnable
.
Imaginons une classe permettant d'enregistrer chaque nombre dans un fichier. Tout dépendant de la quantité, celà pourrait prendre plusieurs secondes :
Temps total d'exécution : 47512 ms
En lançant l'exécution, le premier fichier doit être terminé avant de débuter le second.
En modifiant légèrement la classe pour lui permettre d'implémenter Runnable, celle-ci pourrait effectuer son travail dans un thread, permettant d'accélérer l'exécution.
Temps total d'exécution : 30585 ms, une amélioration de 35%.