Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Mappa di Thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    153

    Mappa di Thread

    Salve a tutti!!

    Sto studiando l'esempio del classico server Multithread, cioè ad ogni nuova connessione apro un thread associato a quel socket.

    Per avere contezza dei thread, e quindi delle comunicazioni aperte, uso una Hashtable, in cui dopo aver creato il thread relativo alla connessione inserisco un record con:
    Key = th.getName()
    Object = "Il thread stesso"

    Ho pensato di creare un altro Thread di sistema che cicla continuamente questa mappa per verificare se un thread è attivo oppure no... Se il thread risulta inattivo, lo voglio chiudere.

    Per fare questo ho usato questo codice:
    codice:
    public static void main(String[] args) {
        Hashtable<String, MyObj> tab = new Hashtable();
    
        MyObj value = new MyObj();
        value.setStr("Ciao");
        value.start();
    
        tab.put(value.getName(), value);
    
        for (Enumeration e = tab.keys(); e.hasMoreElements(); ) {
            String key = (String) e.nextElement();
            MyObj elem = tab.get(key); // Torna una copia del valore e non il suo riferimento
            elem.closeChannel();
        }
    
        for (Enumeration e = tab.keys(); e.hasMoreElements(); ) {
            String key = (String) e.nextElement();
            MyObj elem = tab.get(key);
            System.out.println(elem.getName()+" - "+elem.getStr1());
        }
    }
    Come ho scritto nel commento, quando nel primo for invoco il "get(key)" il passaggio dell'oggetto contenuto nella Hashtable non avviene per riferimento, per cui la chiamata successiva a "closeChannel()" chiuderà il thread copia estratto dalla tab e lascerà in esecuzione il thread originale....

    In pratica non ho concluso niente... avete una soluzione??

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    in una mappa il metodo get ritorna un riferimento all'oggetto, ma l'oggetto RESTA all'interno della mappa.
    Logica vuole che in questo caso assieme alla chiusura del canale, fai una remove del tuo oggetto (mappa.remove(key))
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    153
    ma rimuovendo l'oggetto dalla mappa, rimuovi il riferimento al thread, il quale però, secondo me, rimane in esecuzione... e non avrò più riferimenti per poterlo controllare...

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    MyObj è una tua classe, corretto?
    Il comando di close deve in sequenza chiudere la connessione, far terminare in conseguenza di questo il thread e solo al termine di questo uscire.
    Se close finisce senza problemi, puoi rimuovere il thread e questo non è pendente (non è uno zombie)
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    153
    intendevo che essendo che il closeChannel() viene invocato sulla copia, e non sullo stesso oggetto... non finisco per chiudere il thread copia e in relatà l'istanza del thread originale rimane zombie???

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    no perché hai una copia del riferimento, quindi ogni modifica che fai sulla copia interviene sull'originale.
    RTFM Read That F*** Manual!!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    153
    Ecco.. proprio questo volevo sapre... quindi non è una copia dell'oggetto in se... per l'importante era ovviamente poter lavorare sul puntatore, anche se per copia è fondamentale che mi permetta di agire sullo stesso oggetto contenuto nella mappa!

    Grazie!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    si ma attento che in genere di un thread non fai il riavvio, se hai bisogno di un oggetto che faccia la stessa cosa fai un nuovo thread, quindi quando lo chiudi, termini e rimuovi dalla mappa
    RTFM Read That F*** Manual!!!

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    PS: l'istanziazione di quella Hashtable non è formalmente corretta. Quando si ha a che fare coi generics, si deve sempre specificare il tipo nella chiamata del costruttore (infatti, quel codice genera un warning, perchè stai istanziando un row-type):

    codice:
    Hashtable<String, MyObj> tab = new Hashtable<String,MyObj>();
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.