import java.awt.*; import java.applet.Applet; public class Clock extends Applet { private Second second; private Minute minute; public void init() { TickTock minuteTick = new TickTock(); minute = new Minute(minuteTick, this); minute.start(); second = new Second(minuteTick, this); second.start(); } public void paint(Graphics g) { minute.display(g); second.display(g); } } class Second extends Thread { private int seconds = 0; private TickTock minuteTick; private Applet applet; public Second(TickTock minuteTick, Applet applet) { this.minuteTick = minuteTick; this.applet = applet; } public void run() { while(true) { try { Thread.sleep(1000); } catch (InterruptedException e) { System.err.println("Exception"); } if (seconds == 59) { minuteTick.tick(); seconds = 0; } else seconds++; applet.repaint(); } } public void display(Graphics g) { g.clearRect(10, 0, 100, 20); g.drawString(seconds + " seconds", 10, 20); } } class Minute extends Thread { private int minutes = 0; private TickTock minuteTick; private Applet applet; public Minute(TickTock minuteTick, Applet applet) { this.minuteTick = minuteTick; this.applet = applet; } public void run() { while(true) { minuteTick.waitForTick(); if (minutes == 59) { minutes = 0; } else minutes++; applet.repaint(); } } public void display(Graphics g) { g.clearRect(10, 20, 100, 20); g.drawString(minutes + " minutes", 10, 40); } } class TickTock { private boolean tickHappens = false; public synchronized void waitForTick() { while (!tickHappens) try { wait(); } catch (InterruptedException e) { System.err.println("Exception"); } tickHappens = false; } public synchronized void tick() { tickHappens = true; notify(); } }