Ejemplo

public static final Boolean lock = Boolean.TRUE;

public static void main( String[] args ) {
Runnable runnable = new Runnable() {
public void run() {
synchronized ( lock ) {
while ( true ) {
System.out.println( "Hello World!" ); //$NON-NLS-1$
try { wait( 1000 ); } catch (InterruptedException e) {}
}
}
}
};
Thread thread = new Thread( runnable );
thread.start();
try { Thread.sleep( 3000 ); } catch (InterruptedException e) {}
thread.stop();
}

Solución
A continuación se muestra el extracto del Javadoc (copyright de Sun Microsystems)
Muchos usos de stop deben sustituirse por código que simplemente modifique alguna variable para indicar que la hebra de destino debe dejar de ejecutarse.
La hebra de destino debe comprobar esta variable de forma regular, y volver del método run de forma ordenada si la variable indica que debe dejar de ejecutarse. Si la hebra de destino espera largos periodos de tiempo (por ejemplo, en una variable de condición), debe utilizarse el método interrupt para interrumpir la espera.
Utilice el StopSafeRunnable proporcionado.

public static abstract class StopSafeRunnable implements Runnable {
public final void run() {
while ( !stopped ) {
doRun();
}
}
public void stop() {
stopped = true;
}
public boolean isStopped() {
return stopped;
}
protected abstract void doRun();

private boolean stopped = false;
}

public static void main(String[] args) {
StopSafeRunnable runnable = new StopSafeRunnable() {
public void doRun() {
System.out.println( "Hello World" ); //$NON-NLS-1$
try { Thread.sleep( 1000 ); } catch (InterruptedException e) {}
}
};
Thread thread = new Thread( runnable );
thread.start();
try { Thread.sleep( 3000 ); } catch (InterruptedException e) {}
runnable.stop();
}