Thread

Les ingrédients techniques :

  • la méthode run (de la classe Thread et de l'interface Runnable)
  • la méthode start de la classe Thread

Les deux façons de disposer d'un thread en java

Il existe 2 façons de définir un objet thread en Java :

  • en définissant une classe qui hérite de la classe Thread du langage Java, et en donnant une définition (un corps) à la méthode publique run. Tous les objets, instances de cette classe, posséderont leur propre « fil » de contrôle. La méthode run définit le comportement de chaque thread.
  • en définissant une classe qui implémente l’interface runnable, c’est à dire qui définit la méthode run introduite par l’interface runnable. Les objets, instances de cette classe, ne sont néanmoins pas des threads. Mais, on pourra les faire s’exécuter sur un objet thread.

La première façon de procéder est simple, mais présente des limitations du fait de l’absence d’héritage multiple.

La deuxième façon est plus complexe, mais plus souple et puissante.

Hériter de la classe thread : 1ère façon

Le texte de classe thread est donnée dans l’annexe 4, mais nous en donnerons quelques extraits pour introduire certains concepts.

Hériter de la classe Thead. Hériter donc la méthode run que l'on redéfinit

class Train extends Thread {

public Train (String string, int dureeTrajet){

super (string); // On appelle le constructeur de la classe

// Thread

this.duree_trajet =dureeTrajet ;

}

private int dureeTrajet ;

public void run () {

Ligne.departBrest () ;

sleep (dureeTrajet) ;

// se suspendre pendant un certain laps de temps

Ligne.arriveeKonkLeon () ;

}

}

On peut alors créer des objets, instances de la classe Train.

Train expressDe18h = new Train ("Iroise", 425) ;

Train omnibusde6h = new Train ("Hobbit", 657) ;

Attention. Ces 2 objets ne sont pas encore actifs. Ils n’ont pas encore de fils de contrôle propre. On a seulement appelé le constructeur de la classe Train qui a appelé le constructeur sans paramètre de la classe Thread, ce constructeur effectuant un certain nombre d’initialisations.

Quand un objet, instance de la classe Thread, sera activé en utilisant la méthode start, on viendra exécuter la méthode run. Toute la vie « active » d’un objet thread est décrite par la méthode run .

Remarque 1. Attention de na pas oublier de donner une implémentation à la méthode run

Attention la classe thread n’est pas abstraite. Elle fournit une définition par défaut à la méthode run (nous la présenterons plus tard). Oublier de redéfinir la méthode run dans la classe Train n’est pas perçue comme une erreur., ni à la compilation, ni à l'exécution

Remarque 2. La méthode run est une méthode comme une autre

La méthode run (dont la déclaration provient de l'interface Runnable, voir fig. 1) est publique ; un client peut donc l’appeler directement de l’extérieur, mais ceci ne crée pas un fil d’exécution séparé. Il s’agit d’un appel procédural normal. Le programmeur n'a pas de moyens de cacher cette méthode (car par héritage en java, contrairement à C++, on ne peut pas réduire la visibilité d'une méthode). La seule chose que peut faire le programmeur, c'est d'introduire un test qui vérifie que le thread courant (celui qui exécute la méthode) est l'objet courant).

public void run () {

if (Tread. CurrentThread == this) {

Ligne.departBrest () ;

sleep (dureeTrajet) ;

// se suspendre pendant un certain laps de temps

Ligne.arriveeKonkLeon () ;

}

}

Remarque 3. Notion de thread parent

Attention, c’est le thread qui a appelé le constructeur qui est appelé le thread parent, et non celui qui a appelé la fonction start. Nous verrons que le thread parent « hérite » de certaines propriétés du thread parent, sa priorité initiale par exemple.

Remarque 4 : Attention à un même objet Thread peut correspondre plusieurs threads (fils d'exécution)!!!

Attention. Rien n'empêche de lancer plusieurs activations du "même thread" (activations par le client ou dans une méthode). Plusieurs fils de contrôle exécutent la méthode run du même objet thread.

Train expressDe18h = new Train (("Paris-Algesira", 367) ;

expressDe18h.start () ; // première activation.

expressDe18h.start () ; // seconde activation concurrente.

Cela peut être une erreur de la part du programmeur, mais pas obligatoirement.

Fournir une implémentation à l’interface Runnable : 2ème façon.

Le langage Java ne permet pas l’héritage multiple. Si vous souhaitez qu’une classe active hérite d’une autre classe que Thread, il faut utiliser l’interface Runnable.

Implémenter l'interface Runnable et fournir une implémentation à la méthode run

class Bonjour extends Applet implements Runnable {

public Bonjour () {} ;

public void run () {

// le corps du thread

}

}

La classe Bonjour implémente l'interface Runnable en fournissant une définition à la méthode run.

Attention, définir un objet de la classe thread ne définit pas un thread.

Bonjour bonjour ;

Il faut passer par la création et l'activation d'un objet, instance de la classe Thread. C'est ce dernier objet qui aura en charge l'exécution de la méthode run.

L'activation peut se faire par objet client externe, ou par l'objet bonjour lui-même.

Activation par un client

Thread threadSupport = new Thread (bonjour);

Le thread est seulement créé (il n'est pas encore activé) ; il est initialisé pour venir exécuter la méthode run de l'objet bonjour.

C'est quand on lancera l'activation du thread à l'aide de la méthode start, qu'il y aura création d'un fil de contrôle séparé exécutant la méthode run de l'objet bonjour.

ThreadSupport.start () ;

Activation dans le constructeur (ou dans une méthode quelconque) de l'objet bonjour.

class Bonjour extends Applet implements Runnable {

private Thread thread_support;

public Bonjour () {

X = new Thread (this);

X. start () ;

} ;

public void run () {

// le corps du thread

}

public void creerFil () {

new Thread (this).start () ;

}

}

Dans un cas, c'est à la création de l'objet bonjour (dans le constructeur) que l'on crée un fil venant exécuter la méthode run de l'objet bonjour.

Dans le second cas, c'est à chaque appel de la méthode creerFil qu'un nouveau thread est créé.

» Glossaire programmation concurrente et Java