class Incrementer extends Thread { String name; Counter c; Incrementer(String name, Counter q){ this.c = q; this.name = name; System.out.println("Incrementer " + name + " created"); } public void run() { while(true){ c.increment(); System.out.println(name + " incremented the counter to " + c.counter); try { Thread.sleep(10); } catch (InterruptedException e) {return;} } } } class Decrementer extends Thread { String name; Counter c; Decrementer(String name, Counter q){ this.c = q; this.name = name; System.out.println("Incrementer " + name + " created"); } public void run() { while(true) { c.decrement(); System.out.println(name + " decremented the counter to " + c.counter); try { Thread.sleep(10); } catch (InterruptedException e) {return;} } } } class Counter { int counter; public Counter(int i) { counter = i; } public synchronized void increment() { try { while (counter >= 10) wait(); } catch (InterruptedException e) {return;} counter++; notifyAll(); } public synchronized void decrement() { try { while (counter <= 0) wait(); } catch (InterruptedException e) {return;} counter--; notifyAll(); } public static void main(String[] args) { Counter c = new Counter(0); new Incrementer("x", c).start(); new Incrementer("y", c).start(); new Decrementer("z", c).start(); new Decrementer("w", c).start(); } }