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().