Prova a togliere l'istruzione condizione = 0 nel metodo ferma() e vedrai che non basta chiamare interrupt() per femare il thread.
Se vuoi ti posto un esempio:
codice:
import java.net.*;
import java.io.*;
public class Esempio extends Thread {
private boolean run = true;
private String msg = "";
private int i = 0;
public void ferma() {
run = false;
}
public void run() {
try {
while(run) {
System.out.print(++i + " ");
}
} catch(Exception e) { System.out.println(e); }
System.out.println("Esco da run");
}
public static void main(String args[]) {
Esempio e = new Esempio();
e.start();
new Controllo(e);
}
}
class Controllo extends Thread {
private Esempio esempio;
Controllo(Esempio e) {
esempio = e;
start();
}
public void run() {
try {
Thread.sleep(2000);
} catch(Exception e) { System.out.println(e); }
esempio.interrupt();
System.out.println("Chiamato interrupt");
if(esempio.isAlive())
System.out.println("Il thread e' ancora attivo");
try {
Thread.sleep(5000);
} catch(Exception e) { System.out.println(e); }
esempio.ferma();
System.out.println("Chiamato ferma");
System.out.println("Esempio fermato");
}
}
L'uscita da run e' determinato solo dalla variabile di controllo run.
In realta' il metodo interrupt() si comporta in maniera analoga: imposta a true lo stato di una variabile interna, che puo' essere letta tramite i metodi interrupted() o isInterrupted().