Maitriser ses ressources

Nous allons nous rafraichir la mémoire sur l’ordonnancement des threads, nous verrons comment  partager au mieux les ressources de ces threads. Pour les personnes ayant besoin d’un bon rafraichissement, au lieu d’exécuter le code a la suite, les threads permettent de faire tourner en parallèle du code. Par exemple, sur un serveur, vous pouvez écouter les requêtes et les traiter parallèlement.

Créer un thread.

Dans ce thread, nous allons faire tourne en simultané le code de un ThreadA et de deux ThreadB.

class ThreadA implements Runnable {
   public void run() {
      System.out.println("Je suis le Thread A");
      System.out.println("Je suis toujours le Thread A");   }
}
 
class ThreadB implements Runnable {
   public void run() {
      System.out.println("Je suis le Thread B");
      System.out.println("Je suis toujours le Thread B");   }
   }
}
 
public class ManyNames {
   public static void main(String [] args) {
 
      Thread myThreadA = new ThreadA();
      Thread myThreadB_1 = new ThreadB();
      Thread myThreadB_2 = new ThreadB();
 
      myThreadA.start();
      myThreadB_1.start();
      myThreadB_2.start();
    }
}

Ce code vous affichera plusieurs lignes du type
Je suis le Thread A
Je suis le Thread B
Je suis toujours le Thread A
Je suis le Thread B
Je suis toujours le Thread B
Je suis toujours le Thread B

L’ordre des phrases n’est pas garanti. C’est la JVM qui gère l’ordonnancement des threads.

Jonglage entre threads

La JVM s’occupe d’allouer du temps de calcul a chaque Thread. Pour gérer le temps d’allocation pour chaque Thread, la JVM planifie de façon préemptive (c’est à dire avec la possibilité d’interrompre une tache) et un système de priorité.

Régler sa Priorité

Il existe 10 niveaux de priorité allant de 1 a 10. Le niveau maximal étant le niveau 10 et le niveau le plus faible étant 1.

Sur certaines JVM, il n’y a pas 10 niveaux. Toutefois rassurez-vous, la JVM de Sun contient ces 10 niveaux.

Vous pourrez retrouver ce niveau avec les constantes
·    Thread.MIN_PRIORITY (1)
·    Thread.NORM_PRIORITY (5)
·    Thread.MAX_PRIORITY (10)

Attention ! Régler la priorité ne vous garantira pas forcement une part de temps de calcul beaucoup plus grand.

Priorité par défaut

Le thread initial (lorsque vous lancez votre application) est de niveau 5, c’est-à-dire de niveau normal. Tous les threads enfants d’un thread ont par défaut (c’est-à-dire sans avoir explicitement défini la priorité a l’aide de .setPriority) le niveau de priorité du thread parent.

Laisser la main a la JVM avec yield()

La méthode static yield() (static est donc indépendant d’un objet mais pas indépendant  au thread en cours) .

Différents états d’un thread en Java.

La méthode yield()va refaire passer l’état de « en cours » d’execution à « exécutable ».

La méthode yield() permet de dire a la JVM qu’on a plus rien de spécial a faire dans le thread en cours et qu’on laisse du temps d’execution au profit d’un autre thread.

A voir aussi:

Sources:

  • Salut Eric

    Article interessant mais on m’a fait la remarque que c’est de la programmation à l’ancienne. Il vaut mieux parler des nouvelles classes de Java 5 et 6 avec entre autre la classe Executor, plus simple à manipuler pour les debutants et bien plus propre à programmer je pense

    Nicolas

    http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executor.html

  • Bonjour Nicolas,

    Ton collègue n’a pas vraiment tort. Executor est plutôt un framework et non un outil, comme on devrait utiliser ArrayList à la place de Vector.

    Comme pas mal de framework, il permet une implémentation plus rigoureuse et maintenable, mais pas forcement plus de souplesses.

    Mais les bases de ce framework repose toujours sur les concepts exposés ci dessus et on offre.

    Avant de se lancer dans l’utilisation d’un framework, il est bon de comprendre le sous-jacent.