Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Java Thread.destroy();

  1. #1

    Java Thread.destroy();

    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 !!! :-)

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    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;
    }
    }

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

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    ok, invece di invocare destroy() invoca un metodo setIsRunning(false) che imposta il valore del booleano
    con qualke modifica il destroy lo dimentichi :gren:

  5. #5
    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
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  6. #6

    Ti posto il codice...

    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());
    }
    }

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

  8. #8
    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 !!!!

  9. #9
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    nella 1.4.0 c'è ma non è implemented, ma sappiamo come fare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.