[Java] multithreading et sleep

multithreading et sleep [Java] - Programmation

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 ?

Reply

Marsh Posté le 14-11-2001 à 16:06:04   

Reply

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.

Reply

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 :
  1. import java.io.*;
  2. class Test extends Thread
  3. {
  4. public void run()
  5. {
  6.  while(true)
  7.  {
  8.  System.out.println("Hello!" );
  9.  try {Thread.sleep(1000);} catch(InterruptedException e) {}
  10.  }
  11. }
  12. }
  13. public class HelloWorld
  14. {
  15. public static void main(String args[])
  16. {
  17.  Test thread=new Test();
  18.  thread.start();
  19.  while(true)
  20.  {
  21.   System.out.println("..." );
  22.   try{Thread.sleep(5000);} catch(InterruptedException e) {}
  23.  }
  24. }
  25. }

Reply

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

Reply

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 ...).


---------------
quand il n'y a pas de solution c'est qu'il n'y a pas de problème !!
Reply

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 :
  1. Green threads are the default threads provided by the JDKTM. Native threads are the threads that are provided by the native OS:
  2. Native threads can provide several advantages over the default green threads implementation, depending on your computing situation.
  3. Benefits of using the native threads:
  4. If you run JavaTM code in a multi-processor environment, the Solaris kernel can schedule native threads on the parallel processors for increased performance. By contrast, green threads exist only at the user-level and are not mapped to multiple kernel threads by the operating system. Performance enhancement from parallelism cannot be realized using green threads.
  5. The native threads implementation can call into C libraries that use Solaris native threads. Such libraries cannot be used with green threads.
  6. When using the native threads, the VM can avoid some inefficient remapping of I/O system calls that are necessary when green threads are used.


 
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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed