Exemplo

público estático final Booleano bloqueio = Boolean.TRUE;
público estático booleano runCond = verdadeiro;

público estático nulo principal( Cadeia[] args ) {
Executável executável = novo Executável() {
público nulo executar() {
sincronizado (bloqueio){
enquanto ( runCond ) {
System.out.println( "Olá, Mundo!" ); //$NON-NLS-1$
tentar { aguardar( 1000 ); } capturar (InterruptedException e) {}
}
}
}
};
Encadeamento encadeamento = novo Encadeamento( executável );
thread.start();
tentar { Thread.sleep( 3000 ); } capturar (InterruptedException e) {}
thread.suspend();
tentar { Thread.sleep( 3000 ); } capturar (InterruptedException e) {}
thread.resume();
runCond = falso;
}
Solução
Remova o código que chama o encadeamento de suspender/retomar.
Utilize o SuspendSafeRunnable fornecido.

público estático abstrato classe SuspendSafeRunnable estende StopSafeRunnable {
público nulo doRun() {
checkForPause();
doWork();
}
público nulo suspender() {
sincronizado ( bloqueio ) {
suspenso = verdadeiro;
lock.notifyAll();
}
}
público nulo retomar() {
sincronizado ( bloqueio ) {
suspenso = falso;
lock.notifyAll();
}
}
público booleano isPaused() {
retornar suspenso;
}
protegido abstrato nulo doWork();

privado nulo checkForPause() {
sincronizado ( bloqueio ) {
enquanto ( suspenso ) {
tentar {
lock.wait();
} catch (InterruptedException e) {}
}
}
}
privado booleano suspenso = falso;
privado Objeto bloqueio = novo Objeto();
}

público estático nulo principal( Cadeia[] args ) {
SuspendSafeRunnable executável = novo SuspendSafeRunnable() {
público nulo doWork() {
System.out.println( "Olá, Mundo!" ); //$NON-NLS-1$
tentar { Thread.sleep( 1000 ); } capturar (InterruptedException e) {}
}
};
Encadeamento encadeamento = novo Encadeamento( executável );
thread.start();
tentar { Thread.sleep( 3000 ); } capturar (InterruptedException e) {}
runnable.suspend();
tentar { Thread.sleep( 3000 ); } capturar (InterruptedException e) {}
runnable.resume();
tentar { Thread.sleep( 3000 ); } capturar (InterruptedException e) {}
runnable.stop();
}