Another way to suspend and resume
public class AlternateSuspendResume extends Object implements Runnable { private volatile int firstVal; private volatile int secondVal; private volatile boolean suspended; public boolean areValuesEqual() { return (firstVal == secondVal); } public void run() { try { suspended = false; firstVal = 0; secondVal = 0; workMethod(); } catch (InterruptedException x) { System.out.println("interrupted in workMethod()"); } } private void workMethod() throws InterruptedException { int val = 1; while (true) { // blocks if suspended is true waitWhileSuspended(); stepOne(val); stepTwo(val); val++; // blocks if suspended is true waitWhileSuspended(); Thread.sleep(200); // pause before looping again } } private void stepOne(int newVal) throws InterruptedException { firstVal = newVal; // simulate some other lengthy process Thread.sleep(300); } private void stepTwo(int newVal) { secondVal = newVal; } public void suspendRequest() { suspended = true; } public void resumeRequest() { suspended = false; } private void waitWhileSuspended() throws InterruptedException { while (suspended) { Thread.sleep(200); } } public static void main(String[] args) { AlternateSuspendResume asr = new AlternateSuspendResume(); Thread t = new Thread(asr); t.start(); try { Thread.sleep(1000); } catch (InterruptedException x) { } for (int i = 0; i < 10; i++) { asr.suspendRequest(); try { Thread.sleep(350); } catch (InterruptedException x) { } System.out.println("dsr.areValuesEqual()=" + asr.areValuesEqual()); asr.resumeRequest(); try { Thread.sleep((long) (Math.random() * 2000.0)); } catch (InterruptedException x) { } } System.exit(0); } }