probleme de thread [JAVA] - Java - Programmation
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)
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...
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 ...
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
Marsh Posté le 08-07-2002 à 16:42:51
et ton thread avant[numproc] se termine ou pas ??
Dis nous en plus !!
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....????
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 ...)
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 !
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
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 !
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
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 ?
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 ? [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..
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...
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 !
Marsh Posté le 08-07-2002 à 17:37:17
dans ton programme principal
|
Dans ton thread
|
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 ...
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 ! |
eh mais c'est pas à toi que je parlais. Justement tes remarques sont excellentes. Ct pour bruno la remarque
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?
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
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.....
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
Marsh Posté le 09-07-2002 à 11:01:03
[i] |
je ne vois pas lesquelles ?
et sinon effectivement ma classe s appelle LinterAvant
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 .....
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
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 :
|
mais ca ne compile pas, est ce que ca peut venir de mon java 1.4 ???
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 ?
Marsh Posté le 09-07-2002 à 12:40:08
[i]ca compile pas voici l erreur |
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......
Marsh Posté le 09-07-2002 à 13:54:52
c kwa la ligne 51?
Marsh Posté le 09-07-2002 à 14:19:31
ca ?
MonThread t = new MonThread();
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 ...
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