class MyThread implements Runnable { Thread thrd; boolean suspended; boolean stopped; MyThread(String name) { thrd = new Thread(this, name); suspended = false; stopped = false; thrd.start(); } public void run() { try { for (int i = 1; i < 10; i++) { System.out.print("."); Thread.sleep(50); synchronized (this) { while (suspended) wait(); if (stopped) break; } } } catch (InterruptedException exc) { System.out.println(thrd.getName() + " interrupted."); } System.out.println("\n" + thrd.getName() + " exiting."); } synchronized void stop() { stopped = true; suspended = false; notify(); } synchronized void suspend() { suspended = true; } synchronized void resume() { suspended = false; notify(); } } public class Main { public static void main(String args[]) throws Exception { MyThread mt = new MyThread("MyThread"); Thread.sleep(100); mt.suspend(); Thread.sleep(100); mt.resume(); Thread.sleep(100); mt.suspend(); Thread.sleep(100); mt.resume(); Thread.sleep(100); mt.stop(); } }