Przykład

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

Rozwiązanie
Poniższy fragment to część dokumentacji Javadoc (copyright Sun Microsystems)
Wielokrotne wywoływanie metody stop powinno zostać zastąpione kodem, który modyfikuje zmienną wskazującą na potrzebę zatrzymania wykonywania wątku docelowego.
Wątek docelowy powinien regularnie sprawdzać tę zmienną i poprawnie wracać ze swojej metody run w przypadku, gdy zmienna ta wskazuje na potrzebę zatrzymania wykonywania. Jeśli wątek docelowy oczekuje przez dłuższe okresy czasu (na przykład na zmienną warunku), w celu przerwania oczekiwania należy użyć metody interrupt.
Użyj udostępnionej klasy 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();
}