Tuer un thread

Tuer un thread - Java - Programmation

Marsh Posté le 03-06-2004 à 03:47:42    

J'utilise un thread dans mon programme Java.
Je voudrais tuer ce thread pour le relancer ensuite.
 
Je connais 2 possibilites (cf Thinking in Java http://www.bruceeckel.com ) pour le faire:
- utiliser un boolean stop et dans la methode run() du thread on stop le thread si le boolean est a vrai.
- dans le cas ou le thread est bloque dans le run() par un wait(), on utilise Thread.interrupt() ensuite on met le thread a null et on appelle le ramasse-miette
 
Malheureusement dans la methode run() de mon thread, j'utilise ServerSocket.accept() qui se bloque en attendant un client et donc les 2 solutions ci-dessus ne fonctionnent pas.
 
Je voudrais donc savoir s'il existe une solution pour tuer puis relancer mon thread alors que celui-ci est bloque par ServerSocket.accept()
 
Je me pose aussi la question d'utiliser java.nio
Si j'ai bien compris ca permet de faire comme le select() en C et donc on n'utilise pas de thread ?

Reply

Marsh Posté le 03-06-2004 à 03:47:42   

Reply

Marsh Posté le 03-06-2004 à 08:16:17    

bon, je te donne l'adresse de l'élite mondiale du java, mais tu la répètes pas !
 
http://www.javaspecialists.co.za/archive/Issue056.html


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 03-06-2004 à 21:23:37    

J'ai un problème similaire et j'avais essayé la méthode de nraynaud mais le Thread attend une connexion sur le socket, et ca bloque donc jusqua ce que quelqu'un se connecte au socket
code :

Code :
  1. /**
  2.      * Starts a new Thread for the server
  3.      */
  4.     public void run() {
  5.         try{
  6.             ss = new ServerSocket(port);
  7.             while(ss!=null || !ss.isClosed()) {
  8.                 Socket s = ss.accept();
  9.                 new Request(s, ht);
  10.             }
  11.         }
  12.         catch(SocketException e) {
  13.             System.err.println("Serveur stoppé : Socket closed" );
  14.         }
  15.         catch(IOException e) {
  16.             System.err.println(e);
  17.         }
  18.     }
  19.    
  20.     /**
  21.      * Starts the server, it calls the method run() of this Runnable object
  22.      */
  23.     public synchronized void start() {
  24.         if(!t.isAlive()) {
  25.             //System.err.println("starting..." );
  26.             t.start();
  27.         }
  28.     }
  29.    
  30.     /**
  31.      * Stops the server
  32.      */
  33.     public synchronized void stop() {
  34.         try {
  35.             if(isRunning()) {
  36.                 ss.close();
  37.             }
  38.         }
  39.         catch(IOException e) {
  40.             System.err.println(e);
  41.         }
  42.         finally {
  43.             ss = null;
  44.         }
  45.     }
  46.    
  47.    
  48.     /**
  49.      * Returns if the server is currently running
  50.      * @return true if the server is running
  51.      */
  52.     public synchronized boolean isRunning() {
  53.         return (ss != null && !ss.isClosed());
  54.     }


Cette méthode marche à peu pres, mais tends à bugguer par moment.
Est-ce que quelq'un a une autre solution ?
 
Merci.

Reply

Marsh Posté le 03-06-2004 à 21:41:12    


t'as vraiment lu l'article cité par trainaud?
1/ il y est dit que Thread.interupt() est buggué concernant les appels IO bloquants
2/ pour countourner le pb, il faut fermer la socket avant de tenter de fermer la thread


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 03-06-2004 à 23:17:03    

[hs]
[troll]

Citation :

je te donne l'adresse de l'élite mondiale du java


 
Bah merde, il est même pas valide W3C, et il merdoie avec un navigateur qui respecte les standards du web comme Firefox...  :sweat:  
 
[/troll]
[/hs]
 

Reply

Marsh Posté le 04-06-2004 à 12:17:53    

raytaller a écrit :

[hs]
[troll]

Citation :

je te donne l'adresse de l'élite mondiale du java


 
Bah merde, il est même pas valide W3C, et il merdoie avec un navigateur qui respecte les standards du web comme Firefox...  :sweat:  
 
[/troll]
[/hs]

chez moi ça marche sans pb.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 04-06-2004 à 12:52:15    

nraynaud a écrit :

chez moi ça marche sans pb.


 
+1

Reply

Marsh Posté le 04-06-2004 à 17:08:18    

http://tom.rethaller.free.fr/vrac/PasValideW3CCeSite.PNG

Reply

Marsh Posté le 04-06-2004 à 17:25:24    

nraynaud a écrit :

bon, je te donne l'adresse de l'élite mondiale du java, mais tu la répètes pas !
 
http://www.javaspecialists.co.za/archive/Issue056.html


http://www.javaspecialists.co.za/d [...] itius.html
Des cours comme ca j'en veux bien tous les jours


---------------
[:whatde]
Reply

Marsh Posté le 04-06-2004 à 17:25:47    

Reply

Marsh Posté le 04-06-2004 à 17:25:47   

Reply

Marsh Posté le 04-06-2004 à 17:28:17    

schnapsmann a écrit :

t'as vraiment lu l'article cité par trainaud?
1/ il y est dit que Thread.interupt() est buggué concernant les appels IO bloquants
2/ pour countourner le pb, il faut fermer la socket avant de tenter de fermer la thread


C'est bon j'ai trouvé une solution qui marche très bien sans utiliser interrupt();
Mais merci (en effet, je n'avais pas bien lu)


Message édité par yo c spi le 04-06-2004 à 17:31:07
Reply

Marsh Posté le 07-06-2004 à 22:58:07    

Je remercie nraynaud pour son lien, maintenant ca fonctionne.
 
yo c spi > c'est quoi ta solution, ca interesse du monde !

Reply

Marsh Posté le 07-06-2004 à 23:12:57    

de rien.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-06-2004 à 01:29:46    

tanguy a écrit :

yo c spi > c'est quoi ta solution, ca interesse du monde !


surement une boucle avec un boolean qui passe à false au moment de tuer le thread ...

Reply

Marsh Posté le 08-06-2004 à 01:32:28    

benou a écrit :

surement une boucle avec un boolean qui passe à false au moment de tuer le thread ...

http://glenn.sanson.free.fr/killtheshadoks/s8.gif


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-06-2004 à 02:21:13    

benou a écrit :

surement une boucle avec un boolean qui passe à false au moment de tuer le thread ...


Le probleme c'est que justement dans le cas present on ne peut pas, sinon j'aurais jamais pose la question ;)

Reply

Sujets relatifs:

Leave a Replay

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