La création et le lancement des threads passent obligatoirement par l'extension de la classe Thread ou de l'implémentation de l'interface Runnable.
L'héritage de la classe Thread possède l'inconvénient d'empêcher la classe de pouvoir hériter d'autres classes. C'est pourquoi l'implémentation de l'interface Runnable est plutôt conseillée pour la création de threads.
Une classe implémentant l'interface Runnable doit impérativement déclarer la méthode run() chargée de décrire les instructions que doit exécuter l'unité d'exécution.
class PremierThread implements Runnable { // Le constructeur PremierThread(){ //Instructions... } public void run() { // Instructions relatives à l'unité d'exécution } } // Création du processus thread PremierThread t = new PremierThread(); Thread thread = new Thread(t); // Démarrage du thread et exécution t.run() thread.start(); // start() est une méthode de la classe Thread
Il est également possible de créer une classe héritant de Thread, dans laquelle la méthode run() est redéfinie en surchargeant la méthode héritée.
class PremierThread extends Thread { // Le constructeur PremierThread(){ //Instructions... } public void run() { // Instructions relatives à l'unité d'exécution } } // Création du processus thread PremierThread thread = new PremierThread(); // Démarrage du thread et exécution thread.run() thread.start(); // start() est une méthode de la classe Thread
Une classe Thread encapsule les données et les méthodes associées à l'unité d'exécution.
L'héritage multiple n'étant pas autorisé par la plateforme Java, l'extension de la classe Thread ne peut être utilisée dans tous les cas de programmation orientée objet, notamment lorsqu'une classe doit hériter d'un composant graphique.
public class CreationThread extends Thread { private int opG; private int opD; private long temps; public CreationThread(int opD, int opG, long temps) { this.opD = opD; this.opG = opG; this.temps = temps; //Définit un thread démon setDaemon(true); } public void run(){ int resultat = 0; try{ while(true){ resultat = opD + opG; System.out.print(opG + " + "); //Temporisation du thread courant sleep(temps); System.out.print(opD + " = " + resultat); System.out.print(" (Normalement : " _ + opD + " + " + opG + ")\n"); } } catch(InterruptedException e){ e.printStackTrace(); } } } import java.io.*; public class Test { public static void main(String[] args){ try{ System.out.println("Appuyez sur la touche " + "'Entrée' pour arréter le programme !"); //Instanciation et démarrage de 5 threads... Thread t1 = new CreationThread(10, 101, 100L); Thread t2 = new CreationThread(20, 202, 200L); Thread t3 = new CreationThread(30, 303, 300L); Thread t4 = new CreationThread(40, 404, 400L); Thread t5 = new CreationThread(50, 505, 500L); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); System.in.read(); System.out.println("Fin du programme !"); } catch(Exception e){ e.printStackTrace(); } } }