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
Lo siguiente es un extracto de Java doc (copyright by Sun Microsystems)
Muchas utilizaciones de stop deberían sustituirse por código que simplemente modifica una variable para indicar que se debe detener la ejecución de la hebra destino.
La hebra destino debe comprobar esta variable regularmente y volver del método run de forma ordenada si la variable indica que la ejecución debe detenerse. Si la hebra destino espera durante largos periodos de tiempo (en una variable de condición, por ejemplo), el método interrupt debe utilizarse para interrumpir la espera.
Utilizar StopSafeRunnable.

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();
}