[JAVA] probleme de thread

probleme de thread [JAVA] - Java - Programmation

Marsh Posté le 08-07-2002 à 16:09:52    

Salut a tous,
 
j ai créé une application multi thread.
j aimerai que l un des thread soit plus rapide que d autre pour executer le prog :
en fait je lance 10 memes threads en meme tps. lors d un clic je veux privilegier l un des threads. Pour cela je stoppe tous les autres et laisse tourner mon thread.  
LE PROBLEME est que tout le programme se stoppe ????
 
savez vous pourkoi ???
merci d avance....
bruno

Reply

Marsh Posté le 08-07-2002 à 16:09:52   

Reply

Marsh Posté le 08-07-2002 à 16:13:54    

sans voir ton code et sans savoir comment tu fais pour "stopper" les threads comme tu dis, non
 
stop() est deprecated (juste pour info)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 16:19:49    

en fait j ai utilise interrupt et suspend();
for(i=0;i<10;i++)
{
  if (avant[i]!=null && i != numproc)
  {
     System.out.println("j enleve le process : "+i);
     avant[i].suspend();
  }
}
 
et apres j attends la fin de avant[numproc] en faisant
while(avant[numproc.isAlive())
{...}
 
et ca tourne en boucle...

Reply

Marsh Posté le 08-07-2002 à 16:30:26    

bruno5678 a écrit a écrit :

en fait j ai utilise interrupt et suspend();
for(i=0;i<10;i++)
{
  if (avant[i]!=null && i != numproc)
  {
     System.out.println("j enleve le process : "+i);
     avant[i].suspend();
  }
}
 
et apres j attends la fin de avant[numproc] en faisant
while(avant[numproc].isAlive())
{...}
 
et ca tourne en boucle...




Tout d'abord : supend() est lui aussi déprecated : utiliser plutot yield() ou bien un bon petit sleep() ...
Ensuite, tu peux, si tu veux, utiliser une variable synchronized pour bloquer les autres threads (tu notifies tant que c'est pas le bon thread qui essaie d'accéder a la variable et sinon, tu bloques (c'est pas tres propres mais je vois pas bien ce que tu veux faire !)
 
Sinon, tu fais un thread a part qui manage les threads ...  
Il les endort et les réveille quand il faut ...

Reply

Marsh Posté le 08-07-2002 à 16:34:43    

Sinon, tu fais un thread a part qui manage les threads ...  
Il les endort et les réveille quand il faut ...

 
C ce que je veux faire

Reply

Marsh Posté le 08-07-2002 à 16:42:51    

et ton thread avant[numproc] se termine ou pas ??
Dis nous en plus !!

Reply

Marsh Posté le 08-07-2002 à 16:53:31    

oui tous mes thread se termine.
en fait je vais lire un fichier (un thread = un  fichier)
je fais de la lecture en parallele.
ds mon prog principal lorsque je clique sur un fichier je veux l afficher. pour cela il faut que la lecture soit finie.
c pour ca que je veux endormir la lecture des autres fichier ezt termine la lecture du fichier clique.
Le probleme est que ca ne marche tjrs pas avec yield().
mes threads ne s endorme pas
voici le code de mes thread
try
{
     
url = new URL(urltemp);
URLConnection connexion = url.openConnection();
System.out.println("ICI 2 de "+index);
connexion.setRequestProperty("referer", "http://www.linterweb.com" );
connexion.setRequestProperty("user-agent", "Mozilla/4.75 [en] (Windows NT 5.0; U)" );
LineNumberReader lecture = new LineNumberReader(new InputStreamReader(connexion.getInputStream()));
buff.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n<BASE HREF=\""+connexion.getURL().toString()+"\">" );
     
System.out.println("ICI 3 de "+index);
     
while ((temp=lecture.readLine())!=null)
buff.append(temp+"\r\n" );
     
System.out.println("ICI 4 de "+index);
     
FileWriter f = new FileWriter(rep+(index%10)+".html" );
f.write(buff.toString());
f.close();
     
System.out.println("ICI 5 de "+index);
     
}
catch(Exception e)
{
try
{
FileWriter f = new FileWriter(rep+(index%10)+".html" );
f.close();
System.out.println("fin de "+index);
}
catch(Exception ex){}
}
}
 
le truc bizarre est que une fois que j ai fait mon yield tous les thread tourne sauf celui que je veux....????

Reply

Marsh Posté le 08-07-2002 à 17:01:16    

Plusieurs questions : tu lances tes threads comment ?
Le code que tu viens de donner est dans quelle méthode ?
Et avec sleep() ca marche pas non plus ??
et avec 1 seul thread (tu le bloques par exemple si tu cliques sur un bouton ...)

Reply

Marsh Posté le 08-07-2002 à 17:04:11    

de plus utilise join() plutot que ton while( avant[numproc].isAlive()){...} ... sinon tu bouffes ton cpu pour rien !

Reply

Marsh Posté le 08-07-2002 à 17:06:16    

chapi456 a écrit a écrit :

de plus utilise join() plutot que ton while( avant[numproc].isAlive()){...} ... sinon tu bouffes ton cpu pour rien !




 
il semble qu'une petite révision s'impose :)
 
http://java.sun.com/docs/books/tut [...] index.html


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 17:06:16   

Reply

Marsh Posté le 08-07-2002 à 17:08:42    

DarkLord a écrit a écrit :

 
 
il semble qu'une petite révision s'impose :)
 
http://java.sun.com/docs/books/tut [...] index.html




 
Une petite révision concernant quoi ?
Honnetement, j'ai pas le courage de tout lire pour trouver la betise que j'ai pu dire ! :sleep:

Reply

Marsh Posté le 08-07-2002 à 17:09:23    

en fait je lance mes threads avec un for
ie  
for (i=0;i< 10;i++)
{
avant[i]=new linteravant(param1,param2)
}
 
avec avant = thread[10];
j ai essaye avec join() mais le probleme est que je reprends la main a la fin des 10 threads : donc ca ne me sert pas plus....
je vais essayer avec un sleep et te dis ca apres erci

Reply

Marsh Posté le 08-07-2002 à 17:12:59    

bruno5678 a écrit a écrit :

en fait je lance mes threads avec un for
ie  
for (i=0;i< 10;i++)
{
avant[i]=new linteravant(param1,param2)
}
 
avec avant = thread[10];
j ai essaye avec join() mais le probleme est que je reprends la main a la fin des 10 threads : donc ca ne me sert pas plus....
je vais essayer avec un sleep et te dis ca apres erci




tu fais pas de avant[i].start() ...
C'est bizarre tout de même  :??:  
et tu n'as pas de méthode run() dans ton thread je suppose ?  :sarcastic:

Reply

Marsh Posté le 08-07-2002 à 17:18:52    

tu fais pas de avant[i].start()[i]
si je le fais dans l initialisation de mon objet
et tu n'as pas de méthode run() dans ton thread je suppose ?  :sarcastic: [i]
bien sur que oui c ds mon objet
 
je ne les ai pas mis pour eviter de prendre trop de place désolé
pour la confusion..

Reply

Marsh Posté le 08-07-2002 à 17:23:18    

en fait j ai l impression que je ne lance pas de thread ??
car lorsque je fais un avant[i].sleep(5000);
c tout mon prog principal qui s endort et mon thread continu...

Reply

Marsh Posté le 08-07-2002 à 17:23:37    

normalement, le start() doit être fait dans le thread principal (pas dans le thread lui même ...)
essaie de mettre le start dans la boucle for ...
avant[i] = ....
avant[i].start();
 
La, ca devrait corriger ton probleme !

Reply

Marsh Posté le 08-07-2002 à 17:24:52    

ok j essai merci

Reply

Marsh Posté le 08-07-2002 à 17:30:31    

bah non ca marche pas plus ;-{

Reply

Marsh Posté le 08-07-2002 à 17:37:17    


dans ton programme principal


 
Thread t = new Thread(truc1, truc2)
t.start();
System.out.println("Normalement, ca doit sleeper a partir de maintenant ..." );
t.sleep(10000);
System.out.println("La c'est la fin du slip ..." );
t.join();
System.out.println("Thread terminé ..." );


 
Dans ton thread  


public void run() {
System.out.println("thread débute ..." );
for (int i=1; i< 100000000; i++) {
}
System.out.println("thread termine ..." );
}
 


 
Normalement, en faisant ca, ca doit te mettre le 1er message, attendre 10 secondes et pis te mettre le deuxieme, ensuite, ca execute ton thread (affichage de 'thread debute' et 'thread se termine';)et pis le 3e message ...

Reply

Marsh Posté le 08-07-2002 à 17:57:00    

chapi456 a écrit a écrit :

 
 
Une petite révision concernant quoi ?
Honnetement, j'ai pas le courage de tout lire pour trouver la betise que j'ai pu dire ! :sleep:  




 
eh mais c'est pas à toi que je parlais. Justement tes remarques sont excellentes. Ct pour bruno la remarque ;)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 17:57:36    

OK merci

Reply

Marsh Posté le 09-07-2002 à 01:19:41    

bruno5678 a écrit a écrit :

en fait je lance mes threads avec un for
ie  
for (i=0;i< 10;i++)
{
avant[i]=new linteravant(param1,param2)
}
 
avec avant = thread[10];
j ai essaye avec join() mais le probleme est que je reprends la main a la fin des 10 threads : donc ca ne me sert pas plus....
je vais essayer avec un sleep et te dis ca apres erci




 
Juste une chose
une class commence toujours par une MAJUSCULE!  
 
sinon t a essayé de modifier les priorité de tes threads?
 
 

Reply

Marsh Posté le 09-07-2002 à 09:17:31    

ca donne quoi maintenant ?

Reply

Marsh Posté le 09-07-2002 à 10:37:51    

et ben en fait ca marche pas mieux
je réexplique mon probleme car je pense que je n est pas ete clair
 
ce que je veux faire :  
 
je veux executer en parallele 10 threads + mon prog principal. Il faut que celui ci ait toujurs la main (d ou la necessite des threads). Je veux a tout moment pouvoir arreter les thread que je veux afin d'en privilegier un (en fait les threads utilisent la connexion internet, comme ca si je les arretes je recupere la bande passante et apres je peux traiter plus rapidement un thread).
 
Donc cela se resume en ceci : pa

Reply

Marsh Posté le 09-07-2002 à 10:44:51    

par exemple :  
 
class MonThread(param1) extends Thread
{
public void run()
{
while(true)
  System.out.println(param1)
}
}
 
ds mon prog principal :
 
...
for (i=0;i<10;i++)
{
avant[i] = new MonThread(i);
avant[i}.start();
}
 
//donc maintenant j ai une suite de 0 1 2 3 4 5 6 7 8  9 qui s imprime a l ecran...
 
quand je fais ds mon prog principal  
for (i=0;i<10;i++)
{
if (i!=4)
avant[i].yield();
}
 
//donc en fait je voudrais que ts mes threads stoppent sauf le 4eme.
 
donc je veux a l ecran une suite de 3( on commence a 0).
 
Le probleme est que j ai toujours mes suites de 0 1 2 3 4 5 6 7 8 9.....

Reply

Marsh Posté le 09-07-2002 à 10:48:40    

je precise aussi que ds mes thread je n ai pas de while donc il se termine bien tous
 
en fait je vais lire via internet des fichiers (exactement 10)
mais l utilisateur peut vouloir lire un fichier qui n a pas fini d etre DL. donc pour accelerer le thread je stoppe tous les autres afin qu il puisse beneficier de toute la bande passante.
 
quant au prog principal il faut qu il attende que le fichier soit completement DL pour etre afffiche. Donc il faut que le thread choisit soit termine.
D ou le code un peu plus haut

Reply

Marsh Posté le 09-07-2002 à 11:01:03    

[i]
veryfree  a écrit :
--------------------------------------------------------------------------------
en fait je lance mes threads avec un for  
ie  
for (i=0;i< 10;i++)  
{  
avant[i]=new linteravant(param1,param2)  
}  
 
avec avant = thread[10];  
j ai essaye avec join() mais le probleme est que je reprends la main a la fin des 10 threads : donc ca ne me sert pas plus....  
je vais essayer avec un sleep et te dis ca apres erci  
 
 
--------------------------------------------------------------------------------
 
 
 
Juste une chose  
une class commence toujours par une MAJUSCULE!  
 
sinon t a essayé de modifier les priorité de tes threads?  
 
[/i]


 
je ne vois pas lesquelles ?
 
et sinon effectivement ma classe s appelle LinterAvant

Reply

Marsh Posté le 09-07-2002 à 11:56:16    

tu as essayé avec le programme tout simple que je t'ai donné ?
Oublie un peu les 10 threads et vérifie si avec 1 seul ca marche la demande d'arret !
Si tu simplifies pas ton probleme, jamais on pourra trouver ou se situe le probleme !
Donc essaie avec 1 seul thread ... (commence par l'exemple que j'ai fourni), ensuite, dans ce thread, tu mets le code qu'il te faut et tu vérifies ...
Etc .....

Reply

Marsh Posté le 09-07-2002 à 12:03:11    

tu as raison j essaie avec ton code et te dis apres si ca marche ou pas...
 
 
merci

Reply

Marsh Posté le 09-07-2002 à 12:22:34    

ca compile pas voici l erreur
C:\PROGRA~1\XINOXS~1\JCREAT~1\MYPROJ~1\EXEMPL~1\essai.java:51: non-static variable this cannot be referenced from a static context
 
 
j ai refait un programme avec le thread et un main tout bete :  


import java.net.*;
import java.io.*;
 
public class essai
{
public static fonction f;
 
class MonThread extends Thread
{
public MonThread()
{
System.out.println ("creation de " );
}
public void run() {
System.out.println("thread débute ..." );
for (int i=1; i< 100000000; i++) {
}
System.out.println("thread termine ..." );
}
 
}
 
 
 
public static void main(String[] argv)
{
try
{
MonThread t = new MonThread();
t.start();
System.out.println("Normalement, ca doit sleeper a partir de maintenant ..." );
t.sleep(10000);
System.out.println("La c'est la fin du slip ..." );
t.join();
System.out.println("Thread terminé ..." );
 
while (true)
System.out.println("je suis le pere" );
}
catch(Exception e){}
}
}


 
mais ca ne compile pas, est ce que ca peut venir de mon java 1.4 ???

Reply

Marsh Posté le 09-07-2002 à 12:31:02    

mais c'est quoi ces posts à la con franchement!!! Ca te dirait pas d'ajouter l'erreur que ton compilo recrache ... C'est quand meme le minimum non ?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 09-07-2002 à 12:40:08    

[i]ca compile pas voici l erreur  
C:\PROGRA~1\XINOXS~1\JCREAT~1\MYPROJ~1\EXEMPL~1\essai.java:51: non-static variable this cannot be referenced from a static context [/i]


 
mais c'est quoi ces posts à la con franchement!!! Ca te dirait pas d'ajouter l'erreur que ton compilo recrache ... C'est quand meme le minimum non ?
 
oui c le minimum d ailleurs il y est......

Reply

Marsh Posté le 09-07-2002 à 13:54:52    

c kwa la ligne 51?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 09-07-2002 à 14:10:29    

ds le main juste apres try

Reply

Marsh Posté le 09-07-2002 à 14:19:31    

ca ?
 
MonThread t = new MonThread();  


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 09-07-2002 à 14:23:06    

tu fais une inner class dans ta classes essai (qui devrait s'appeller Essai). Donc pour construire une instance d'une inner classe tu dois avoir une instance d'essai ...
 


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 09-07-2002 à 14:23:46    

oui
apparemment le compilateur n en veut pas ??

Reply

Marsh Posté le 09-07-2002 à 14:25:21    

ok

Reply

Marsh Posté le 09-07-2002 à 14:27:45    

c bon ca marche

Reply

Marsh Posté le 09-07-2002 à 14:31:39    

qu'est ce qui marche le test ou tout ton programme ??

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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