Newsgroup: it.comp.java
Titolo: Thread

Ciao a tutti, 
ho questa classe:
public class Tux extends Thread{
	static String sName = "polaroid";	
	public static void main(String[] args){
		Tux t = new Tux();
		t.piggy(sName);
		System.out.println(sName);
	}
 
	public void piggy(String sName){		
 
		sName = sName + " reflex";
		start();		
	}
 
	public void run(){
		for (int i = 0; i<4; i++){
			sName = sName + " " + i;
		}
	}
}
Non capisco perchč stampa a viedo solo la scritta "polaroid".
Prima di lanciare il thread, alla variabile sName viene aggiunta la parola
"reflex", perň a debug ho visto che viene modificata.
Cosa succede in quel caso? Grazie.
Calypso
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 }
this.sName = sName + " reflex";
-- 
Davide Consonni

 Calipso Kid wrote:



Grazie, come mai bisogna aggiungere "this"?


 Grazie, come mai bisogna aggiungere "this"?
Quello che hai evidenziato è il classico problema di "visibilità": hai 
dato al parametro del metodo piggy() lo stesso nome di un attributo di 
classe. Nel momento in cui, nel metodo piggy(), agisci su sName, vai a 
modificare il valore dell'oggetto passato come parametro, e non quello 
dell'attributo di classe.
La modifica suggerita da Calipso Kid, seppur funzionante, 
necessiterebbe di una piccola modifica: l'utilizzo di this indica al 
compilatore di far riferimento ad un attributo di un *oggetto* e non ad 
un eventuale variabile locale (o parametro) con lo stesso nome (come 
nel tuo caso). Tuttavia, tu hai dichiarato sName utilizzando il 
modificatore static, ed identificando quindi l'attributo come attributo 
di *classe*. In questo caso, il metodo migliore per richiamarlo è 
utilizzare la sintassi
Tux.sName = sName + " reflex";
anteponendo il nome della classe al nome dell'attributo.
Un consiglio: cerca di imparare bene i concetti di this e compagnia con 
tutorial e libri, sono le basi della programmazione java, e se non hai 
chiari questi concetti difficilmente riuscirai a concentrarti su 
problemi più complessi ;)
Ciao!

 La modifica suggerita da Calipso Kid, seppur funzionante, necessiterebbe di 
Scusa, la modifica era stata suggerita da Davide Consonni, Calipso Kid 
sei tu...chiedo venia! :D

 Ciao!
Mannaggia, l'ho dimenticato!
La variabile sName è locale al metodo piggy di conseguenza le modifiche
non sono visibile all'uscita del metodo.
Mi sai dare anche una tua spiegazione al perchè il metodo run non parte? 
Secondo me perchè il thread princiale (main) termina subito dopo
l'istruzione di stampa e quindi il ciclo for non riesce a partire.
Giusto?


 Giusto?
Non credo che il metodo run non parta, secondo me viene eseguito e 
termina correttamente. Sono più propenso a credere che il problema 
dipenda da un fattore di scheduling del sistema operativo, che fa prima 
terminare il metodo main che riesce ad essere eseguito nel suo time 
quantum, e poi parte l'esecuzione del metodo run.
Non scordare che richiamare lo start() non fa altro che far partire un 
thread indipendente, che poi verrà eseguito davvero soltanto quando il 
sistema operativo lo schedulerà per l'esecuzione.
Nel tuo caso, abbiamo chiarito che non stampa il "reflex" perchè lo 
aggiungevi al parametro e non alla variabile di classe. Il perchè non 
stampi i numeri dopo "polaroid" secondo me è legato al motivo di cui 
sopra. Per provare potresti mettere, prima della println() del main, 
una sleep, in modo da forzare l'esecuzione del run() del thread (o, in 
alternativa, mettere delle println() nel metodo run(), anche se 
potrebbe essere meno deterministico come risultato, a causa della 
natura dello stream di scrittura su stdout, e non è escluso che alcune 
stampe potrebbero scambiarsi).
Ciao!

 Ciao!
Ho aggiunta una sleep(1000) e stampa correttamente.
Grazie, ora è tutto chiaro.
Ciao!
Calypso Kid


 Ho aggiunta una sleep(1000) e stampa correttamente.
Corretto quello che dice Elvandar, ma il sistema migliore per
attendere che il thread lanciato termini l'esecuzione e' usare il
metodo join() e non lo sleep(), visto che non puoi sapere a priori
quanto dura l'esecuzione del thread.
--
SoulSpirit