Passaggio parametri tra Thread e Classe chiamante

di il
4 risposte

Passaggio parametri tra Thread e Classe chiamante

Salve a tutti,
ho questa situazione:

Classe Client:

public class Client {
 
    ...
    
    public void sendAliveMessage(String clientName, DatagramSocket sock, InetAddress addr, int port) throws IOException{  
      	//do something
    }
  
    public static void main(String args[]) throws IOException, InterruptedException{
        
        ...
        
        Client cl = new Client();
          
        ClientThread clientThread = new ClientThread(cl);
        clientThread.start();
        
        while(true){
             
            if(clientThread.isLogged()){
                cl.sendAliveMessage(cl.getClientName(), sock, clientThread.getServerAddress(), clientThread.getServerPort());
            }
        }
    }
}
Classe ClientThread:

public class ClientThread extends Thread{
 
	...
    private InetAddress serverAddress;
    private int serverPort;
    private Client client;
    private boolean logged;
 
    public ClientThread(Client cl){
        client = cl;
	logged = false;
    }
 
    @Override
    public void run(){
         
       ...
       
        while(true){
                ...
                
                serverAddress = InetAddress.getByName(decodedString[0]);
                serverPort = Integer.parseInt(decodedString[1]);
                logged = true;
 
           	...
        }
 
    }
    
   public InetAddress getServerAddress() {
        return serverAddress;
    }

    public int getServerPort() {
        return serverPort;
    }
    
    public boolean isLogged(){
    return logged;
    }
}
Ho segnato con i ... le istruzioni non attinenti al problema.
Il mio desiderio è che che l'esecuzione del while del main (classe Client) entri in quell'if nel momento in cui nel thread viene settato a true il suddetto boolean.

Purtroppo noto che ciò non avviene:
Stampando infatti il valore di clientThread.isLogged() nel ciclo while il risultato è sempre false.
Commentando l'if ho notato che invece i parametri clientThread.getServerAddress() e clientThread.getServerPort() vengono correttamente passati al main.

Idee? Forse conoscete un modo migliore per passare parametri dal thread alla classe chiamante?

4 Risposte

  • Re: Passaggio parametri tra Thread e Classe chiamante

    Non ho capito niente, ma probabilmente e' perche tu stai pensando all'utilizzo di un thread che non centra nulla con il thread!

    Vediamo di mettere i puntini sulle u, come fanno i tedeschi:

    1) tu NON PASSI PARAMETRI ad un thread in esecuzione
    2) tu PASSI DEI PARAMETRI al thread SOLO in fase di creazione. Quindi lui parte e a questo punto tu e luoi andate per strade separate (un po' come quando la morosa ti pianta )

    Se tu vuoi passare dei DATI al thread, il meccanismo e':

    1) tu metti i dati da qualche parte
    2) lui, ogni tanto, va a controllare se ci sono dati da processare, e se ci sono LI PRENDE in carico.
    LUI li prende in carico, NON SEI TU a darli a lui!

    questo in poche parole, perche' ad andare nel detfaglio ci puoi scrivere un libro.
  • Re: Passaggio parametri tra Thread e Classe chiamante

    Mmm ma io voglio fare il contrario.
    Il thread va per i cavoli suoi e setta il boolean per i cavoli suoi.

    Dal while del main voglio andarmi a prendere il valore di una variabile definita nel thread. Quindi dal thread voglio prendermi qualcosa, non dargli qualcosa.


    Vedo se riesco a spiegarmi meglio:

    Classe A -> crea THREAD.
    Thread fa i fatti tuoi e tra questi setta un boolean appartenente al thread stesso.
    Classe A -> periodicamente controlla il valore di questo boolean attraverso una funzione isXXX del Thread.

    Il mio problema è che anche se nel thread effettivamente setto il valore di questo boolean, la classe A non "vede" il cambiamento effettuato sulla variabile.
    Quello che non capisco è perché con alcune variabili (vd serverAddress e serverPort) riesco a farlo mentre col boolean no.
  • Re: Passaggio parametri tra Thread e Classe chiamante

    Sincronizza l'accesso al metodo o usa gli oggetti Atomic*
  • Re: Passaggio parametri tra Thread e Classe chiamante

    Scusa mi cogli impreparato. Puoi spiegarti meglio?

    Edit:

    ti ringrazio tantissimo, non conoscevo l'esistenza degli oggetti atomic. Ora funziona alla grande.
Devi accedere o registrarti per scrivere nel forum
4 risposte