jdk/src/java.desktop/share/classes/javax/swing/TimerQueue.java
changeset 32120 06c83c5f2912
parent 31653 d88ff422c7fb
child 32865 f9cb6e427f9e
equal deleted inserted replaced
32119:1778956d7bee 32120:06c83c5f2912
    92 
    92 
    93 
    93 
    94     void startIfNeeded() {
    94     void startIfNeeded() {
    95         if (! running) {
    95         if (! running) {
    96             runningLock.lock();
    96             runningLock.lock();
       
    97             if (running) {
       
    98                 return;
       
    99             }
    97             try {
   100             try {
    98                 final ThreadGroup threadGroup = AppContext.getAppContext().getThreadGroup();
   101                 final ThreadGroup threadGroup = AppContext.getAppContext().getThreadGroup();
    99                 AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
   102                 AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
   100                     String name = "TimerQueue";
   103                     String name = "TimerQueue";
   101                     Thread timerThread = new ManagedLocalsThread(threadGroup,
   104                     Thread timerThread = new ManagedLocalsThread(threadGroup,
   164     public void run() {
   167     public void run() {
   165         runningLock.lock();
   168         runningLock.lock();
   166         try {
   169         try {
   167             while (running) {
   170             while (running) {
   168                 try {
   171                 try {
   169                     Timer timer = queue.take().getTimer();
   172                     DelayedTimer runningTimer = queue.take();
       
   173                     Timer timer = runningTimer.getTimer();
   170                     timer.getLock().lock();
   174                     timer.getLock().lock();
   171                     try {
   175                     try {
   172                         DelayedTimer delayedTimer = timer.delayedTimer;
   176                         DelayedTimer delayedTimer = timer.delayedTimer;
   173                         if (delayedTimer != null) {
   177                         if (delayedTimer == runningTimer) {
   174                             /*
   178                             /*
   175                              * Timer is not removed after we get it from
   179                              * Timer is not removed (delayedTimer != null)
   176                              * the queue and before the lock on the timer is
   180                              * or not removed and added (runningTimer == delayedTimer)
   177                              * acquired
   181                              * after we get it from the queue and before the
       
   182                              * lock on the timer is acquired
   178                              */
   183                              */
   179                             timer.post(); // have timer post an event
   184                             timer.post(); // have timer post an event
   180                             timer.delayedTimer = null;
   185                             timer.delayedTimer = null;
   181                             if (timer.isRepeats()) {
   186                             if (timer.isRepeats()) {
   182                                 delayedTimer.setTime(now()
   187                                 delayedTimer.setTime(now()