Newsgroup: it.comp.java
Titolo: Interrompere un thread in attesa su una accept

Salve,
non so se questa e' tra le FAQ, se si indicatemi dove trovarle.
Non sono molto pratico con Java (normalmente lavoro in C++).
Ho la necessita' di uccidere un thread fermo su una Socket.accept()
ma ne' Thread.stop() ne' Thread.interrupt() sembrano funzionare...
Fondamentalmente ho un Thread il cui metodo run() si puo' riassumere con:
public class Server extends Thread {
// ....vari dettagli omessi
public void run() {
 
        while( isRunning ) {
                Socket mySocket = theMainSocket.accept();
                Worker myWorker = new Worker( mySocket )
                myWorker.start()
        }
}
}
Quando il thread principale esce, vorrei fermare il thread Server,
che e' bloccato sulla accept().
Ho provato sia con stop() che con interrupt() sul thread Server, ma senza
successo. Il programma resta "appeso" 
Come si fa in questi casi ?
Grazie per ogni suggerimento,
Fabio Lopiano

 }
[CUT]
...
Potresti mettere l'oggetto Socket con visibilità di classe e poi invocare un
metodo del thread che esegua il metodo close del socket.
In questo modo il metodo accept dovrebbe sollevare una eccezione che tu
ovviamente catturerai nel corpo del tuo metodo run....
Se hai bisogno di maggior dettagli chiedi pure ...
Ciao ciao e buon lavoro a tutti!
Dany
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If at first the idea is not absurd then there is no hope for it. - Albert
Einstein
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 
In realta' la situazione e' leggermente piu' complicata...
La mia classe Server fa una cosa del genere:
public void run() {
        while (isRunning) {
                WorkUnit myWorkUnit = theProducer.produce();
                theWorkPool.add(myWorkUnit); // the first available consumer
                                             // will do the job         
        }
}
Dove Producer e' un interfaccia.
In particolare, una certa implementazione di Producer ha un socket,
fa la accept e crea una istanza (che implementa l'interfaccia WorkUnit)
Insomma , al livello del metodo run() non ho visibilita' del socket 
(e nemmeno al livello di Producer).
Credo che risolvero' con un semplice System.exit() e chi si e' visto 
si e' visto ;-)
Grazie comunque
Fabio

 
[CUT]
C'è un metodo definitivo ancora migliore... quel tastino del PC con la scritta 
"Power"...
...scusate la boiata...
:-)
-- 
Fausto.

 (e nemmeno al livello di Producer).
[CUT]
mmmm ... non sò se ho capito bene la situazione .. ma non potresti
teoricamente fare in questo modo:
dall'implementazione della classe producer che "ha il socket" aggiungi un
metodo FERMATI che semplicemente
chiude il socket che verrà invocato da un altro thread sempre creato dalla
stesso oggetto che invoca tale metodo in caso non termini la connessione in
un determinato periodo di tempo.. ci sono 3000 modi diversi per fare quello
che ho scritto ... tramite un timer, tramite una wait/notify o tramite una
semplice join(timeout) ....
Se hai bisogno di maggiori spiegazioni o se proprio o cannato e non ho
capito niente fammi sapere ...
ciao ciao
Dani
--
Daniele Piras


 Ho la necessita' di uccidere un thread fermo su una
Socket.accept()
forse la ServerSocket.setSoTimeout(int timeout) potrebbe
risolvere il tuo problema.
Ciao
--
~~~~~~~~~~~~~~~
 Claves do Amaral
 
ela...@libero.it
~~~~~~~~~~~~~~~