class Reader extends Thread { Calculator c; public Reader(Calculator calc) { c = calc; start(); //from ctor } public void run() { synchronized(c) { try { System.out.println("Waiting for calculation..."); c.wait(); } catch (InterruptedException e) {} } System.out.println("Total is " + c.total); } public static void main(String[] args) { Calculator calculator = new Calculator(); // new Reader(calculator).start(); //some number of them new Reader(calculator); //start is in ctor new Reader(calculator); calculator.start(); } } class Calculator extends Thread { int total; public void run() { synchronized(this) { for (int i=0; i<100; i++) total += i; notifyAll(); // notify(); //wake one. others will wake when this ends } //while (true) //but what if this thread never ends? yes // ; try { Thread.sleep(3000); //or goes to sleep for a while } catch (InterruptedException e) {} } }