diff options
Diffstat (limited to 'javax/swing/Timer.java')
-rw-r--r-- | javax/swing/Timer.java | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/javax/swing/Timer.java b/javax/swing/Timer.java index 4e3cd7dc4..f848a9490 100644 --- a/javax/swing/Timer.java +++ b/javax/swing/Timer.java @@ -65,35 +65,51 @@ public class Timer */ public void run() { - running = true; try { - sleep(initialDelay); + synchronized (queueLock) + { + try + { + queueLock.wait(initialDelay); + } + catch (InterruptedException e) + { + // Ignored + } + + if (!running) + return; + + queueEvent(); + + if (repeats) + while (running) + { + try + { + queueLock.wait(delay); + } + catch (InterruptedException e) + { + // Ignored + } - queueEvent(); + if (!running) + break; - if (repeats) - while (running) - { - try - { - sleep(delay); - } - catch (InterruptedException e) - { - return; - } - queueEvent(); + queueEvent(); - if (logTimers) - System.out.println("javax.swing.Timer -> clocktick"); + if (logTimers) + System.out.println("javax.swing.Timer -> clocktick"); - if ( ! repeats) - break; - } - running = false; - } - catch (Exception e) + if (!repeats) + break; + } + running = false; + } + } + finally { // The timer is no longer running. running = false; @@ -399,10 +415,13 @@ public class Timer */ public void start() { - if (isRunning()) - return; - waker = new Waker(); - waker.start(); + synchronized (queueLock) + { + if (waker != null) + return; + waker = new Waker(); + waker.start(); + } } /** @@ -410,12 +429,13 @@ public class Timer */ public void stop() { - running = false; - if (waker != null) - waker.interrupt(); synchronized (queueLock) { + running = false; queue = 0; + if (waker != null) + queueLock.notifyAll(); + waker = null; } } |