multithreading et sleep [Java] - Programmation
Marsh Posté le 14-11-2001 à 16:29:22
ma vraie question est:
la proposition "un thread qui en crée un autre" est-elle équivalente à "deux threads créés par x." ?
merci de me répondre ,c'est urgent.
Marsh Posté le 14-11-2001 à 16:50:14
merci pour vos réponses. Pour m'autorépondre (apparemment ce forum n'est pas prompt à la réponse), je dirais qu'effectivement les deux propositions reviennent aux mêmes, et un sleep dans le thread principal ne gene pas le thread fils. En fait la notion pere-fils n'existe pas comme dans la gestion multi-processus, tous les threads sont indépendants.
Petit exemple pour s'en convaincre (et qui m'a permis de trouver ma réponse)
Code :
|
Marsh Posté le 14-11-2001 à 19:03:51
BenDk97 a écrit a écrit : merci pour vos réponses. Pour m'autorépondre (apparemment ce forum n'est pas prompt à la réponse), je dirais qu'effectivement les deux propositions reviennent aux mêmes, et un sleep dans le thread principal ne gene pas le thread fils. En fait la notion pere-fils n'existe pas comme dans la gestion multi-processus, tous les threads sont indépendants. |
Un sleep sur un processus pere (en programmation unix)
n'endort pas un fils, de ce point de vue la ils sont independants. Je dirais qu'ils sont plus independants que des threads, puisqu'un plantage de processus n'entraine pas la mort
des fils, contrairement a un plantage de threads.
A+
LEGREG
Marsh Posté le 20-11-2001 à 13:18:33
Non, un sleep sur un thread n'endort pas un thread créé depuis le celui-ci.
Par contre il existe la notion de ThreadGroup qui permet de manipuler une arborescence de Threads.
Concernant la remarque précédente, il est faux de dire que le plantage d'un thread entraine le plantage de ses fils.
Un thread est une unité de traitement indépendante qui fonctionne dans un processus. Le processus est, au sens système du terme, un ensemble de thread fonctionnant dans un contexte qui lui est propre (mémoire ...).
Marsh Posté le 20-11-2001 à 14:24:48
Bandenabos a écrit a écrit : Non, un sleep sur un thread n'endort pas un thread créé depuis le celui-ci. Par contre il existe la notion de ThreadGroup qui permet de manipuler une arborescence de Threads. Concernant la remarque précédente, il est faux de dire que le plantage d'un thread entraine le plantage de ses fils. Un thread est une unité de traitement indépendante qui fonctionne dans un processus. Le processus est, au sens système du terme, un ensemble de thread fonctionnant dans un contexte qui lui est propre (mémoire ...). |
je crois que tu n'as rien pige.
On distingue habituellement les processus lourds des processus legers (habituellement appeles threads).
Les processus lourds sont executes dans leur propre espace d'adressage (sur les Processeurs et OS modernes), les threads sont executes dans le meme espace d'adressage et ont juste
un contexte d'execution different.
Pour ce qui est du comportement par rapport aux sleeps, plantages, et appels systemes bloquants, cela depend du systeme, ainsi que de la librairie de threads utilises.
Si le processus est considere comme une seule entite par le systeme, un appel systeme sera bloquant pour tous les threads rattaches a ce processus. Quand je dis threads rattaches a ce processus, je n'inclus pas les processus fils qui sont des processus lourds au sens de l'OS.
C'est pour ca que je distingue le sleep au sens d'Unix
et le sleep au sens de java. Le sleep de la librairie de threads java n'endort pas le processus entier mais seulement le thread.
Par contre les erreurs classiques telles les violations d'acces, si elles sont interceptees par le systeme provoque la mort de tous les threads rattaches au processus !
Par ailleurs dans Java c'est encore plus complique puisqu'une distinction est faite entre les green threads (threads applicatifs) et des native threads (threads systemes): cf extrait de la doc du JDK:
Code :
|
Quel est ce remapping dont il parle? et bien tout simplement
lorsqu'un appel systeme est fait, celui-ci est bloquant pour tout le processus lorsqu'il s'agit de green threads parce que le processus est une entite indivisible au yeux du systeme. POur eviter que les appels soient bloquants, Java est donc oblige de passer par sa propre librairie d'E/S, qui tient compte de ses threads. Si par contre, tu utilises les threads natifs du systeme (ici Solaris), le systeme reconnait chaque thread comme une entite a part entiere et donc peut eviter de tout bloquer lorsqu'un appel d'entre/sortie est fait.
Si certains points ne sont pas clairs me demander .
Par ailleurs je ne reagissais pas sur le point d'utilisation de la librairie java (qui n'est pas discutable: un sleep() sur un thread java n'endort pas le processus entier) mais sur la remarque qui etait faite sur la gestion multiprocessus et la relative independance des threads.
A+
LEGREG
Marsh Posté le 14-11-2001 à 16:06:04
question: si j'ai un thread principal (le main d'une classe) qui lance un Thread fils, puis-je endormir le thread principal (sleep) sans endormir le fils ? est-ce possible ?