Articles récents
JAVA : Gestion des threads
La programmation par thread se développe petit à petit. Déjà en C sous Unix, il y avait une bonne base avec de nombreux outils comme les mutex, sémaphores, spinlock, etc.... le tout plutôt orienté programmation système, temps réels et drivers.
JAVA qui lui est orienté application, propose également ce type de programmation. Nous étudierons dans ce chapitre les concepts de la programmation JAVA sous forme de thread, qui est beaucoup plus simple par rapport au C.
Elle est possible même dans le cas d'une machine mono-processeur, le temps d'activité sera partagée par la machine virtuelle entre les différents threads s'il y en a plusieurs.
1)La Classe Thread
1.1)Présentation
Java propose la classe Thread pour créer des instances. C'est à dire:1.2)Exemple
Nous allons créer deux Thread qui vont afficher plusieurs fois des choses différentes avec un délais d'attente différent également.Notre programme affichera:
Après analyse du résultat, on observe le fonctionnement simultanée des deux threads.
2)L'interface Runnable
Le problème de JAVA est que l'héritage multiple n'existe pas, et il est judicieux d'utiliser une interface plutôt que d'hériter. L'interface Runnable dérive de la classe Thread, elle implémente la méthode run() comme précédemment.Notre programme affichera alors:
3)Interrompre un Thread
3.1)ArrĂŞt des thread entre eux
Il est possible de demander à un thread d'en arrêter un autre. Pour cela le processus t1 fait une demande d'interruption à t2 par t2.interrupt(), et t2 consulte régulièrement un indicateur de demande d'interruption par la méthode statique interrupted() ou la méthode isInterrupted(). Aussi, t2 choisit de s'interrompre (il peut ne pas le faire) et à la possibilité de faire des choses avant, comme la libération des espaces mémoires. Pour interrompre le thread, il suffit d'appeler la fonction return; .A noter que la méthode isInterrupted() teste si le processus passé en variable a été terminé.
3.2)Exemple d'interruption de thread
Notre programme affichera alors:
3.3)Thread démon
Un Thread démon (daemon en anglais) est un programme qui tourne en tâche de fond, généralement en écoute d'une mission à réaliser au fil de l'eau. Comme en C sous Linux, le daemon est rattaché au processus père qui l'a créé, et si le processus père s'arrête, il provoquera l'arrêt automatique des daemons associés. Il n'y a pas de reprise par un processus racine.Pour créer un daemon, il suffit d'appeler la méthode setDaemon(true) sur l'instance de l'objet Thread juste avant de lancer un start(). A noter qu'il existe une méthode isDaemon qui teste si l'instance est un démon.
Le mieux est de voir l'exemple ci-dessous:
Pour arrêter un daemon (ou un Thread), il est possible d'utiliser la mèthode destroy() même si son son utilisation n'est pas conseillé. Autre solution faire un System.exit .
4)La synchronisation des Threads
Nous avons vu précédemment comment créer des programmes qui fonctionnent simultanément. La problématique dans ce type de programmation consiste à gérer les accès concurrentiels aux ressources partagées comme les variables globales.4.1)Les méthodes synchronisées
Ce concept permet de gérer l’accès concurrentiel aux objets. L'idée est de bloquer un thread pour permettre à un autre de travailler. On se place ici dans le cadre d'un objet qui est partagé et utilisé par plusieurs threads. Il faut donc un mécanisme qui le permet en toute sécurité. Java propose donc le mot clé synchronized pour permettre au système de synchroniser les d'accès aux variables. A chaque instant, un seul objet peut accéder à l'objet partagé.Prenons l'exemple d'un objet partagé qui propose juste deux variables, un String et un entier. Créons deux Thread qui incrémentent l'entier et affichent le avec le compteur.
Ce qui donne:
Ici, ce sont les méthodes de calcul qui sont synchronisées. Tout ce passe comme si un verrou était placé pour monopoliser l’accès au méthode de l'objet. Attention, le verrou est mis lors de l'appel si elle est estampillée "synchronized". Il y a un piège à éviter, les méthodes appelées à l'intérieur d'une méthode synchronisée doivent être également synchronized. Sinon, il y a perte du verrou est toute les actions qui suivront dans la méthode ne seront plus sécurisées!
4.2)Synchronisation par bloc
Il est possible de verrouiller un objet pour un bloc d'instruction, c'est comme si on avait un verrou sur les objets déclaré dans le bloc. Et donc le monopole de l'usage de ces objet:Attention, les tableaux ne supportent pas ce type de code.
4.3)Le cadencement des Threads entre eux
Il est possible de cadencer les threads entre eux car on besoin de l'action de l'un pour réaliser l'action de l'autre.Il faut donc rendre l'objet partagé/verrouillé au thread que l'on attend. Pour cela on appelle la fonction wait() de l'objet qui possède le verrou et on notifie les threads par notifyAll() ou notify si on connait le thread en attente.Voici un exemple d'un objet réserve partagé entre un processus qui ajoute ajout et un processus qui retire.
Ce qui affichera:
Conclusion
Les threads permettent de créer des process qui agiront simultanément. On les utilise notamment pour ne pas perdre de temps sur une action qui peut être longue comme par exemple un accès au réseau, au système de fichiers ou pour un calcul complexe et coûteux en temps processeur.
© 2024 www.doritique.fr par Robert DORIGNY