Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2513 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] probleme de thread

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[JAVA] probleme de thread

n°172965
bruno5678
Posté le 08-07-2002 à 16:09:52  profilanswer
 

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

mood
Publicité
Posté le 08-07-2002 à 16:09:52  profilanswer
 

n°172970
darklord
You're welcome
Posté le 08-07-2002 à 16:13:54  profilanswer
 

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
n°172977
bruno5678
Posté le 08-07-2002 à 16:19:49  profilanswer
 

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

n°172984
chapi456
Posté le 08-07-2002 à 16:30:26  profilanswer
 

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

n°172985
bruno5678
Posté le 08-07-2002 à 16:34:43  profilanswer
 

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

n°172989
chapi456
Posté le 08-07-2002 à 16:42:51  profilanswer
 

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

n°173000
bruno5678
Posté le 08-07-2002 à 16:53:31  profilanswer
 

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

n°173008
chapi456
Posté le 08-07-2002 à 17:01:16  profilanswer
 

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

n°173013
chapi456
Posté le 08-07-2002 à 17:04:11  profilanswer
 

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

n°173016
darklord
You're welcome
Posté le 08-07-2002 à 17:06:16  profilanswer
 

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
mood
Publicité
Posté le 08-07-2002 à 17:06:16  profilanswer
 

n°173017
chapi456
Posté le 08-07-2002 à 17:08:42  profilanswer
 

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:

n°173018
bruno5678
Posté le 08-07-2002 à 17:09:23  profilanswer
 

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

n°173021
chapi456
Posté le 08-07-2002 à 17:12:59  profilanswer
 

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:

n°173031
bruno5678
Posté le 08-07-2002 à 17:18:52  profilanswer
 

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

n°173037
bruno5678
Posté le 08-07-2002 à 17:23:18  profilanswer
 

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

n°173039
chapi456
Posté le 08-07-2002 à 17:23:37  profilanswer
 

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 !

n°173041
bruno5678
Posté le 08-07-2002 à 17:24:52  profilanswer
 

ok j essai merci

n°173045
bruno5678
Posté le 08-07-2002 à 17:30:31  profilanswer
 

bah non ca marche pas plus ;-{

n°173053
chapi456
Posté le 08-07-2002 à 17:37:17  profilanswer
 


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

n°173078
darklord
You're welcome
Posté le 08-07-2002 à 17:57:00  profilanswer
 

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
n°173081
bruno5678
Posté le 08-07-2002 à 17:57:36  profilanswer
 

OK merci

n°173247
veryfree
Posté le 09-07-2002 à 01:19:41  profilanswer
 

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?
 
 

n°173305
chapi456
Posté le 09-07-2002 à 09:17:31  profilanswer
 

ca donne quoi maintenant ?

n°173388
bruno5678
Posté le 09-07-2002 à 10:37:51  profilanswer
 

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

n°173397
bruno5678
Posté le 09-07-2002 à 10:44:51  profilanswer
 

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

n°173400
bruno5678
Posté le 09-07-2002 à 10:48:40  profilanswer
 

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

n°173417
bruno5678
Posté le 09-07-2002 à 11:01:03  profilanswer
 

[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

n°173490
chapi456
Posté le 09-07-2002 à 11:56:16  profilanswer
 

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

n°173499
bruno5678
Posté le 09-07-2002 à 12:03:11  profilanswer
 

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

n°173534
bruno5678
Posté le 09-07-2002 à 12:22:34  profilanswer
 

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 ???

n°173543
darklord
You're welcome
Posté le 09-07-2002 à 12:31:02  profilanswer
 

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
n°173556
bruno5678
Posté le 09-07-2002 à 12:40:08  profilanswer
 

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

n°173598
darklord
You're welcome
Posté le 09-07-2002 à 13:54:52  profilanswer
 

c kwa la ligne 51?


---------------
Just because you feel good does not make you right
n°173622
bruno5678
Posté le 09-07-2002 à 14:10:29  profilanswer
 

ds le main juste apres try

n°173630
darklord
You're welcome
Posté le 09-07-2002 à 14:19:31  profilanswer
 

ca ?
 
MonThread t = new MonThread();  


---------------
Just because you feel good does not make you right
n°173634
darklord
You're welcome
Posté le 09-07-2002 à 14:23:06  profilanswer
 

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
n°173635
bruno5678
Posté le 09-07-2002 à 14:23:46  profilanswer
 

oui
apparemment le compilateur n en veut pas ??

n°173639
bruno5678
Posté le 09-07-2002 à 14:25:21  profilanswer
 

ok

n°173640
bruno5678
Posté le 09-07-2002 à 14:27:45  profilanswer
 

c bon ca marche

n°173643
chapi456
Posté le 09-07-2002 à 14:31:39  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] probleme de thread

 

Sujets relatifs
Problème avec un moteur de rechercheproblème... [résolu]
probleme javascript[JS] probleme avec document.form.action
y a un classe java qui permet de bosser sur des chemins ?[JAVA @] logiciel de gestion [DELPHI vous pouvez venir aussi]
[Perl] Mémoire partagé en multi-threadProbleme de requete
[Java] JMS et message queuing 
Plus de sujets relatifs à : [JAVA] probleme de thread


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR