Runnable

Dans la 1ère façon de créer un objet thread, l'objet thread est instance d'une sous-classe de Thread qui fournit une implémentation à la méthode run.

Ce n'est pas toujours possible du fait de l'absence d'héritage multiple en Java

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 la classe Thread, il faut utiliser l’interface Runnable.

Il y a 4 étapes :

a) Définition d'une classe implémentant l'interface Runnable, et donc implémentant la méthode run.

b) Création d'un objet de cette classe (Objet appelé objet de service ou objet "target" dans la documentation java).

c) Création d'un objet Thread en passant l'objet de service comme paramètre de l'objet Thread

d) Activation de l'objet Thread par la méthode start.

Définition d'une classe implémentant l'interface Runnable.

import java.applet.Applet;

class Bonjour extends Applet implements Runnable {

public Bonjour() {

}

public void run() {

System.out.println("Bonjour"); // le corps du thread }

}

Programme 2 . Une classe implémentant l'interface Runnable

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

Création d'un objet de service

Bonjour bonjour = new Bonjour();

Création d'un objet Thread

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 de l'objet de service bonjour. L'objet bonjour est passé en paramètre au constructeur.

Thread threadSupport = new Thread(bonjour);

Cette déclaration utilise le constructeur Thread (Runnable Target). L'objet thread est seulement créé (il n'est pas encore activé) ; il est initialisé afin que, une fois activé, il exécute la méthode run de l'objet bonjour.

Activation de l'objet Thread par la méthode start

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

Activation par un client

L'activation du thread à l'aide de la méthode start entraînera la création d'un nouveau fil de contrôle (moteur) 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

Nous allons montrer 2 cas d'activation :

import java.applet.Applet;

class Bonjour extends Applet implements Runnable {

private Thread threadSupport;

public Bonjour() {

threadSupport = new Thread(this);

threadSupport.start();

}

public void run() {

System.out.println("Bonjour");// le corps du thread

}

public void creerFil() {

new Thread(this).start();

}

}

Programme 3. Activation dans la classe implémentant Runnable

Thread et classe Service

Figure 3 Utiliser un objet de service

Dans un cas, c'est à la création de l'objet bonjour (dans le constructeur) que l'on crée un thread 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éé. On peut noter d'ailleurs qu'il est possible d'avoir plusieurs objets Thread utilisant le même objet service (attention donc aux problèmes de partage des données de l'objet service, problème que nous traiterons au chapitre 3).

» Glossaire programmation concurrente et Java