package ru.nsu.ccfit.kazantsev.seminar6.stopwatch2; public class Stopwatch implements Runnable { private CountListener countListener; private long countInterval; private long time; private boolean onAir; private boolean toRun; public Stopwatch(CountListener countListener) { this(countListener, 10); } public Stopwatch(CountListener countListener, long countInterval) { super(); this.countListener = countListener; this.countInterval = countInterval; this.toRun = true; this.resetCount(); } public void run() { try { while (toRun) { if (this.onAir == true) { time += this.countInterval; countListener.count(time); } else { synchronized (this) { this.wait(); } } Thread.sleep(countInterval); } } catch (InterruptedException ie) { stopCount(); } } public synchronized long getCountInterval() { return countInterval; } public synchronized void setCountInterval(long countInterval) { this.countInterval = countInterval; } public void startCount() { this.onAir = true; wakeup(); } public void stopCount() { this.onAir = false; } public void resetCount() { this.time = 0; this.countListener.count(0); } public void shutdown() { wakeup(); this.toRun = false; Thread.currentThread().interrupt(); } public void wakeup() { synchronized (this) { this.notifyAll(); } } }