PDA

Visualizza la versione completa : Java Thread.destroy();


Mandrake978
10-05-2002, 15:57
Ciao a tutti,
ho fatto una server Socket che mi accetta connessioni creando (per ogni connessione) un thread nuovo e una nuova socket.. quando il server si disconnette, deve segare tutti i thread e chiudere tutte le socket.
I thread e le socket sono storate dentro a due vector diversi.. quando faccio il primo giro per "distruggere" il primo thread mi sparacchia un errore del genere:

Exception occurred during event dispatching:
java.lang.NoSuchMethodError
at java.lang.Thread.destroy(Thread.java:723)
at socketWindowsOldFunz.Server.disconnettiServer Server.java:133)
at socketWindowsOldFunz.ServerConsole$disconnettiMenu Listener.actionPerformed(ServerConsole.java:199)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1450)
at javax.swing.AbstractButton$ForwardActionEvents.act ionPerformed(AbstractButton.java:1504)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:384)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:256)
at javax.swing.AbstractButton.doClick(AbstractButton. java:279)
at javax.swing.plaf.basic.BasicMenuItemUI$MouseInputH andler.mouseReleased(BasicMenuItemUI.java:946)
at java.awt.Component.processMouseEvent(Component.jav a:3771)
at java.awt.Component.processEvent(Component.java:360 0)
at java.awt.Container.processEvent(Container.java:117 3)
at java.awt.Component.dispatchEventImpl(Component.jav a:2649)
at java.awt.Container.dispatchEventImpl(Container.jav a:1222)
at java.awt.Component.dispatchEvent(Component.java:25 53)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:2465)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:2230)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:2139)
at java.awt.Container.dispatchEventImpl(Container.jav a:1209)
at java.awt.Window.dispatchEventImpl(Window.java:923)
at java.awt.Component.dispatchEvent(Component.java:25 53)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 401)
at java.awt.EventDispatchThread.pumpOneEvent(EventDis patchThread.java:109)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:99)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:90)

Grazie a tutti !!! :-)

floyd
10-05-2002, 16:07
leggi nella documentazione, non implementato
ti conviene usare una variabile per capire se chiudere il thread
public void run() {
while (isrunning) {
...
if (quello_che_vuoi)
isrunning = false;
}
}

Mandrake978
10-05-2002, 17:32
E' che il thread lo chiudo da fuori.. nomeThread.destroy() facendo un loop sul vector.. come fa a dirmi che il metodo non implementato ?!?!? L sta l'assurdo...

floyd
10-05-2002, 17:40
ok, invece di invocare destroy() invoca un metodo setIsRunning(false) che imposta il valore del booleano
con qualke modifica il destroy lo dimentichi :gren:

pippo75
10-05-2002, 17:41
dalla documentazione ufficiale:


public void destroy()

Destroys this thread, without any cleanup. Any monitors it has locked remain locked. (This method is not implemented.)

ti conviene eseguire un tuo metodo shutdown, che inizializza la variabile isRunning, e quindi fare come suggerito da floyd

Mandrake978
10-05-2002, 17:41
I due vector vengono implementati alla connessione di un client...

public void start() {
try {
serverSock = new ServerSocket(port); runner = true;
}catch(Exception e){
System.out.println("Server - Errore di partenza del server: " + e.getMessage());
}

while(runner) {
try {
log.store("In attesa di connessioni \n");
s = serverSock.accept();
socksServer.addElement(s);
log.store("..accettata" + s + s.getInetAddress() + "\n");
aggiornaClient = new AggiornaListaClient(chatters,nicknames);
ClientTimer.schedule(aggiornaClient,0,30000);
ServerThread = new ServerEchoRead(s,this); threadServer.addElement(ServerThread);
ServerThread.start();
}catch(IOException e) {
System.out.println("Server - Connessione al server fallita: " + e.getMessage());
}
}
}

Questo metodo viene chiamato dalla console del server..


public void disconnettiServer() {
try {
System.out.println("inizio giro");
en = threadServer.elements();
while(en.hasMoreElements()) {
ServerThread.destroy();
}

System.out.println("primo giro");

en = socksServer.elements();
while(en.hasMoreElements()) {
s.close();
}

runner = false;
console.setIconColor("D:/rosso.gif");
JOptionPane.showMessageDialog(null,"Server disconnesso","Errore",JOptionPane.ERROR_MESSAGE);
color = "red";
log.store("Server disconnesso \n",color);

}catch (Exception ex) {
System.out.println("Server - Errore disconnessione del server " + ex.getMessage());
}
}

Mandrake978
10-05-2002, 17:43
Ops.. scusate... ho postato poco dopo.. ho provato a fare un booleano runner.. che faceva girare il thread fino a che era true.. quando diventa false e il thread si pianta.. eccezione... mo ci riprovo !!!
Grazie !!! :) :) :)

Mandrake978
10-05-2002, 18:02
Col metodo per settare runner a false funziona !!! E' che mi scordavo di svuotare il vector e looppava anche su un solo thread !!!
Grazie e buon week end... Speriamo che nella ver 1.4 del jdk abbiano segato il metodo destroy() :) ciao !!!!

floyd
10-05-2002, 18:09
nella 1.4.0 c' ma non implemented, ma sappiamo come fare
:ciauz:

Loading