Quote Originariamente inviata da kiaBs Visualizza il messaggio
e il metodo stopRunning è il seguente

codice:
public void stopRunning()
{
stopThread = true;
}
Questo di per sé può andare bene. Ma c'è un aspetto importante della variabile di istanza stopThread. Dato che non c'è alcuna sincronizzazione riguardo l'accesso a stopThread, questa variabile deve essere perlomeno marcata con la parola chiave volatile.
Se è volatile, è garantito che la modifica di stopThread da parte di un thread X sia assolutamente "visibile" dal thread che esegue il tuo run(). Altrimenti non ci sono garanzie.

Quote Originariamente inviata da kiaBs Visualizza il messaggio
Una cosa che capisco poco è inoltre questa: fatta partire l'esecuzione del main, in realtà prima mi stampa le azioni che sono scritte successivamente all'avvio del thread. Come mai questo avviene?
Se fai:

codice:
unThread.start();
System.out.println("test");

Lo start() di per sé non avvia ancora un bel niente. Fa solo passare il thread dallo stato "new" (oggetto Thread appena creato) allo stato "runnable" (cioè può essere eseguito). È poi lo scheduler dei thread che decide quando far partire effettivamente il run().
Quindi è perfettamente possibile che quella scritta "test" (e anche qualcos'altro dopo eventualmente) venga eseguita prima che il run() inizi la esecuzione!

Quando si ha a che fare con i thread bisogna tenere a mente che ci sono ben poche cose davvero "garantite" e prevedibili.