ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
(Generate patch)

Comparing jsr166/src/test/tck/ScheduledExecutorTest.java (file contents):
Revision 1.30 by jsr166, Wed Aug 25 00:07:03 2010 UTC vs.
Revision 1.43 by jsr166, Fri May 27 19:48:58 2011 UTC

# Line 1 | Line 1
1   /*
2   * Written by Doug Lea with assistance from members of JCP JSR-166
3   * Expert Group and released to the public domain, as explained at
4 < * http://creativecommons.org/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
# Line 20 | Line 20 | public class ScheduledExecutorTest exten
20          return new TestSuite(ScheduledExecutorTest.class);
21      }
22  
23
23      /**
24       * execute successfully executes a runnable
25       */
26      public void testExecute() throws InterruptedException {
27 <        TrackedShortRunnable runnable =new TrackedShortRunnable();
28 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
29 <        p1.execute(runnable);
30 <        assertFalse(runnable.done);
31 <        Thread.sleep(SHORT_DELAY_MS);
32 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
33 <        Thread.sleep(MEDIUM_DELAY_MS);
34 <        assertTrue(runnable.done);
35 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
36 <        joinPool(p1);
27 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
28 >        final CountDownLatch done = new CountDownLatch(1);
29 >        final Runnable task = new CheckedRunnable() {
30 >            public void realRun() {
31 >                done.countDown();
32 >            }};
33 >        try {
34 >            p.execute(task);
35 >            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
36 >        } finally {
37 >            joinPool(p);
38 >        }
39      }
40  
40
41      /**
42       * delayed schedule of callable successfully executes after delay
43       */
44      public void testSchedule1() throws Exception {
45 <        TrackedCallable callable = new TrackedCallable();
46 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
47 <        Future f = p1.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
48 <        assertFalse(callable.done);
49 <        Thread.sleep(MEDIUM_DELAY_MS);
50 <        assertTrue(callable.done);
51 <        assertEquals(Boolean.TRUE, f.get());
52 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
53 <        joinPool(p1);
45 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
46 >        final long t0 = System.nanoTime();
47 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
48 >        final CountDownLatch done = new CountDownLatch(1);
49 >        try {
50 >            Callable task = new CheckedCallable<Boolean>() {
51 >                public Boolean realCall() {
52 >                    done.countDown();
53 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
54 >                    return Boolean.TRUE;
55 >                }};
56 >            Future f = p.schedule(task, SHORT_DELAY_MS, MILLISECONDS);
57 >            assertEquals(Boolean.TRUE, f.get());
58 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
59 >            assertTrue(done.await(0L, MILLISECONDS));
60 >        } finally {
61 >            joinPool(p);
62 >        }
63      }
64  
65      /**
66 <     *  delayed schedule of runnable successfully executes after delay
67 <     */
68 <    public void testSchedule3() throws InterruptedException {
69 <        TrackedShortRunnable runnable = new TrackedShortRunnable();
70 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
71 <        p1.schedule(runnable, SMALL_DELAY_MS, MILLISECONDS);
72 <        Thread.sleep(SHORT_DELAY_MS);
73 <        assertFalse(runnable.done);
74 <        Thread.sleep(MEDIUM_DELAY_MS);
75 <        assertTrue(runnable.done);
76 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
77 <        joinPool(p1);
66 >     * delayed schedule of runnable successfully executes after delay
67 >     */
68 >    public void testSchedule3() throws Exception {
69 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
70 >        final long t0 = System.nanoTime();
71 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
72 >        final CountDownLatch done = new CountDownLatch(1);
73 >        try {
74 >            Runnable task = new CheckedRunnable() {
75 >                public void realRun() {
76 >                    done.countDown();
77 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
78 >                }};
79 >            Future f = p.schedule(task, SHORT_DELAY_MS, MILLISECONDS);
80 >            assertNull(f.get());
81 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
82 >            assertTrue(done.await(0L, MILLISECONDS));
83 >        } finally {
84 >            joinPool(p);
85 >        }
86      }
87  
88      /**
89       * scheduleAtFixedRate executes runnable after given initial delay
90       */
91 <    public void testSchedule4() throws InterruptedException {
92 <        TrackedShortRunnable runnable = new TrackedShortRunnable();
93 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
94 <        ScheduledFuture h = p1.scheduleAtFixedRate(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, MILLISECONDS);
95 <        assertFalse(runnable.done);
96 <        Thread.sleep(MEDIUM_DELAY_MS);
97 <        assertTrue(runnable.done);
98 <        h.cancel(true);
99 <        joinPool(p1);
100 <    }
101 <
102 <    static class RunnableCounter implements Runnable {
103 <        AtomicInteger count = new AtomicInteger(0);
104 <        public void run() { count.getAndIncrement(); }
91 >    public void testSchedule4() throws Exception {
92 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
93 >        final long t0 = System.nanoTime();
94 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
95 >        final CountDownLatch done = new CountDownLatch(1);
96 >        try {
97 >            Runnable task = new CheckedRunnable() {
98 >                public void realRun() {
99 >                    done.countDown();
100 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
101 >                }};
102 >            ScheduledFuture f =
103 >                p.scheduleAtFixedRate(task, SHORT_DELAY_MS,
104 >                                      SHORT_DELAY_MS, MILLISECONDS);
105 >            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
106 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
107 >            f.cancel(true);
108 >        } finally {
109 >            joinPool(p);
110 >        }
111      }
112  
113      /**
114       * scheduleWithFixedDelay executes runnable after given initial delay
115       */
116      public void testSchedule5() throws InterruptedException {
117 <        TrackedShortRunnable runnable = new TrackedShortRunnable();
118 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
119 <        ScheduledFuture h = p1.scheduleWithFixedDelay(runnable, SHORT_DELAY_MS, SHORT_DELAY_MS, MILLISECONDS);
120 <        assertFalse(runnable.done);
121 <        Thread.sleep(MEDIUM_DELAY_MS);
122 <        assertTrue(runnable.done);
123 <        h.cancel(true);
124 <        joinPool(p1);
117 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
118 >        final long t0 = System.nanoTime();
119 >        final long timeoutNanos = SHORT_DELAY_MS * 1000L * 1000L;
120 >        final CountDownLatch done = new CountDownLatch(1);
121 >        try {
122 >            Runnable task = new CheckedRunnable() {
123 >                public void realRun() {
124 >                    done.countDown();
125 >                    assertTrue(System.nanoTime() - t0 >= timeoutNanos);
126 >                }};
127 >            ScheduledFuture f =
128 >                p.scheduleWithFixedDelay(task, SHORT_DELAY_MS,
129 >                                         SHORT_DELAY_MS, MILLISECONDS);
130 >            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
131 >            assertTrue(System.nanoTime() - t0 >= timeoutNanos);
132 >            f.cancel(true);
133 >        } finally {
134 >            joinPool(p);
135 >        }
136 >    }
137 >
138 >    static class RunnableCounter implements Runnable {
139 >        AtomicInteger count = new AtomicInteger(0);
140 >        public void run() { count.getAndIncrement(); }
141      }
142  
143      /**
144       * scheduleAtFixedRate executes series of tasks at given rate
145       */
146      public void testFixedRateSequence() throws InterruptedException {
147 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
147 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
148          RunnableCounter counter = new RunnableCounter();
149          ScheduledFuture h =
150 <            p1.scheduleAtFixedRate(counter, 0, 1, MILLISECONDS);
151 <        Thread.sleep(SMALL_DELAY_MS);
150 >            p.scheduleAtFixedRate(counter, 0, 1, MILLISECONDS);
151 >        delay(SMALL_DELAY_MS);
152          h.cancel(true);
153          int c = counter.count.get();
154          // By time scaling conventions, we must have at least
155          // an execution per SHORT delay, but no more than one SHORT more
156          assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
157          assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
158 <        joinPool(p1);
158 >        joinPool(p);
159      }
160  
161      /**
162       * scheduleWithFixedDelay executes series of tasks with given period
163       */
164      public void testFixedDelaySequence() throws InterruptedException {
165 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
165 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
166          RunnableCounter counter = new RunnableCounter();
167          ScheduledFuture h =
168 <            p1.scheduleWithFixedDelay(counter, 0, 1, MILLISECONDS);
169 <        Thread.sleep(SMALL_DELAY_MS);
168 >            p.scheduleWithFixedDelay(counter, 0, 1, MILLISECONDS);
169 >        delay(SMALL_DELAY_MS);
170          h.cancel(true);
171          int c = counter.count.get();
172          assertTrue(c >= SMALL_DELAY_MS / SHORT_DELAY_MS);
173          assertTrue(c <= SMALL_DELAY_MS + SHORT_DELAY_MS);
174 <        joinPool(p1);
174 >        joinPool(p);
175      }
176  
138
177      /**
178 <     *  execute(null) throws NPE
178 >     * execute(null) throws NPE
179       */
180      public void testExecuteNull() throws InterruptedException {
181          ScheduledThreadPoolExecutor se = null;
# Line 199 | Line 237 | public class ScheduledExecutorTest exten
237      /**
238       * schedule callable throws RejectedExecutionException if shutdown
239       */
240 <     public void testSchedule3_RejectedExecutionException() throws InterruptedException {
241 <         ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
242 <         try {
240 >    public void testSchedule3_RejectedExecutionException() throws InterruptedException {
241 >        ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
242 >        try {
243              se.shutdown();
244              se.schedule(new NoOpCallable(),
245                          MEDIUM_DELAY_MS, MILLISECONDS);
# Line 209 | Line 247 | public class ScheduledExecutorTest exten
247          } catch (RejectedExecutionException success) {
248          } catch (SecurityException ok) {
249          }
250 <         joinPool(se);
250 >        joinPool(se);
251      }
252  
253      /**
254 <     *  scheduleAtFixedRate throws RejectedExecutionException if shutdown
254 >     * scheduleAtFixedRate throws RejectedExecutionException if shutdown
255       */
256      public void testScheduleAtFixedRate1_RejectedExecutionException() throws InterruptedException {
257          ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
# Line 245 | Line 283 | public class ScheduledExecutorTest exten
283      }
284  
285      /**
286 <     *  getActiveCount increases but doesn't overestimate, when a
287 <     *  thread becomes active
286 >     * getActiveCount increases but doesn't overestimate, when a
287 >     * thread becomes active
288       */
289      public void testGetActiveCount() throws InterruptedException {
290 <        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
291 <        assertEquals(0, p2.getActiveCount());
292 <        p2.execute(new SmallRunnable());
293 <        Thread.sleep(SHORT_DELAY_MS);
294 <        assertEquals(1, p2.getActiveCount());
295 <        joinPool(p2);
290 >        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
291 >        final CountDownLatch threadStarted = new CountDownLatch(1);
292 >        final CountDownLatch done = new CountDownLatch(1);
293 >        try {
294 >            assertEquals(0, p.getActiveCount());
295 >            p.execute(new CheckedRunnable() {
296 >                public void realRun() throws InterruptedException {
297 >                    threadStarted.countDown();
298 >                    assertEquals(1, p.getActiveCount());
299 >                    done.await();
300 >                }});
301 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
302 >            assertEquals(1, p.getActiveCount());
303 >        } finally {
304 >            done.countDown();
305 >            joinPool(p);
306 >        }
307      }
308  
309      /**
310 <     *    getCompletedTaskCount increases, but doesn't overestimate,
311 <     *   when tasks complete
310 >     * getCompletedTaskCount increases, but doesn't overestimate,
311 >     * when tasks complete
312       */
313      public void testGetCompletedTaskCount() throws InterruptedException {
314 <        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
315 <        assertEquals(0, p2.getCompletedTaskCount());
316 <        p2.execute(new SmallRunnable());
317 <        Thread.sleep(MEDIUM_DELAY_MS);
318 <        assertEquals(1, p2.getCompletedTaskCount());
319 <        joinPool(p2);
314 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
315 >        final CountDownLatch threadStarted = new CountDownLatch(1);
316 >        final CountDownLatch threadProceed = new CountDownLatch(1);
317 >        final CountDownLatch threadDone = new CountDownLatch(1);
318 >        try {
319 >            assertEquals(0, p.getCompletedTaskCount());
320 >            p.execute(new CheckedRunnable() {
321 >                public void realRun() throws InterruptedException {
322 >                    threadStarted.countDown();
323 >                    assertEquals(0, p.getCompletedTaskCount());
324 >                    threadProceed.await();
325 >                    threadDone.countDown();
326 >                }});
327 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
328 >            assertEquals(0, p.getCompletedTaskCount());
329 >            threadProceed.countDown();
330 >            threadDone.await();
331 >            delay(SHORT_DELAY_MS);
332 >            assertEquals(1, p.getCompletedTaskCount());
333 >        } finally {
334 >            joinPool(p);
335 >        }
336      }
337  
338      /**
339 <     *  getCorePoolSize returns size given in constructor if not otherwise set
339 >     * getCorePoolSize returns size given in constructor if not otherwise set
340       */
341      public void testGetCorePoolSize() throws InterruptedException {
342 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
343 <        assertEquals(1, p1.getCorePoolSize());
344 <        joinPool(p1);
342 >        ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
343 >        assertEquals(1, p.getCorePoolSize());
344 >        joinPool(p);
345      }
346  
347      /**
348 <     *    getLargestPoolSize increases, but doesn't overestimate, when
349 <     *   multiple threads active
348 >     * getLargestPoolSize increases, but doesn't overestimate, when
349 >     * multiple threads active
350       */
351      public void testGetLargestPoolSize() throws InterruptedException {
352 <        ScheduledThreadPoolExecutor p2 = new ScheduledThreadPoolExecutor(2);
353 <        assertEquals(0, p2.getLargestPoolSize());
354 <        p2.execute(new SmallRunnable());
355 <        p2.execute(new SmallRunnable());
356 <        Thread.sleep(SHORT_DELAY_MS);
357 <        assertEquals(2, p2.getLargestPoolSize());
358 <        joinPool(p2);
352 >        final int THREADS = 3;
353 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(THREADS);
354 >        final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
355 >        final CountDownLatch done = new CountDownLatch(1);
356 >        try {
357 >            assertEquals(0, p.getLargestPoolSize());
358 >            for (int i = 0; i < THREADS; i++)
359 >                p.execute(new CheckedRunnable() {
360 >                    public void realRun() throws InterruptedException {
361 >                        threadsStarted.countDown();
362 >                        done.await();
363 >                        assertEquals(THREADS, p.getLargestPoolSize());
364 >                    }});
365 >            assertTrue(threadsStarted.await(SMALL_DELAY_MS, MILLISECONDS));
366 >            assertEquals(THREADS, p.getLargestPoolSize());
367 >        } finally {
368 >            done.countDown();
369 >            joinPool(p);
370 >            assertEquals(THREADS, p.getLargestPoolSize());
371 >        }
372      }
373  
374      /**
375 <     *   getPoolSize increases, but doesn't overestimate, when threads
376 <     *   become active
375 >     * getPoolSize increases, but doesn't overestimate, when threads
376 >     * become active
377       */
378      public void testGetPoolSize() throws InterruptedException {
379 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
380 <        assertEquals(0, p1.getPoolSize());
381 <        p1.execute(new SmallRunnable());
382 <        assertEquals(1, p1.getPoolSize());
383 <        joinPool(p1);
379 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
380 >        final CountDownLatch threadStarted = new CountDownLatch(1);
381 >        final CountDownLatch done = new CountDownLatch(1);
382 >        try {
383 >            assertEquals(0, p.getPoolSize());
384 >            p.execute(new CheckedRunnable() {
385 >                public void realRun() throws InterruptedException {
386 >                    threadStarted.countDown();
387 >                    assertEquals(1, p.getPoolSize());
388 >                    done.await();
389 >                }});
390 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
391 >            assertEquals(1, p.getPoolSize());
392 >        } finally {
393 >            done.countDown();
394 >            joinPool(p);
395 >        }
396      }
397  
398      /**
399 <     *    getTaskCount increases, but doesn't overestimate, when tasks
400 <     *    submitted
399 >     * getTaskCount increases, but doesn't overestimate, when tasks
400 >     * submitted
401       */
402      public void testGetTaskCount() throws InterruptedException {
403 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
404 <        assertEquals(0, p1.getTaskCount());
405 <        for (int i = 0; i < 5; i++)
406 <            p1.execute(new SmallRunnable());
407 <        Thread.sleep(SHORT_DELAY_MS);
408 <        assertEquals(5, p1.getTaskCount());
409 <        joinPool(p1);
403 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
404 >        final CountDownLatch threadStarted = new CountDownLatch(1);
405 >        final CountDownLatch done = new CountDownLatch(1);
406 >        final int TASKS = 5;
407 >        try {
408 >            assertEquals(0, p.getTaskCount());
409 >            for (int i = 0; i < TASKS; i++)
410 >                p.execute(new CheckedRunnable() {
411 >                    public void realRun() throws InterruptedException {
412 >                        threadStarted.countDown();
413 >                        done.await();
414 >                    }});
415 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
416 >            assertEquals(TASKS, p.getTaskCount());
417 >        } finally {
418 >            done.countDown();
419 >            joinPool(p);
420 >        }
421      }
422  
423      /**
# Line 355 | Line 456 | public class ScheduledExecutorTest exten
456      }
457  
458      /**
459 <     *   is isShutDown is false before shutdown, true after
459 >     * isShutdown is false before shutdown, true after
460       */
461      public void testIsShutdown() {
462  
463 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
463 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
464          try {
465 <            assertFalse(p1.isShutdown());
465 >            assertFalse(p.isShutdown());
466          }
467          finally {
468 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
468 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
469          }
470 <        assertTrue(p1.isShutdown());
470 >        assertTrue(p.isShutdown());
471      }
472  
372
473      /**
474 <     *   isTerminated is false before termination, true after
474 >     * isTerminated is false before termination, true after
475       */
476      public void testIsTerminated() throws InterruptedException {
477 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
477 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
478 >        final CountDownLatch threadStarted = new CountDownLatch(1);
479 >        final CountDownLatch done = new CountDownLatch(1);
480 >        assertFalse(p.isTerminated());
481          try {
482 <            p1.execute(new SmallRunnable());
482 >            p.execute(new CheckedRunnable() {
483 >                public void realRun() throws InterruptedException {
484 >                    assertFalse(p.isTerminated());
485 >                    threadStarted.countDown();
486 >                    done.await();
487 >                }});
488 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
489 >            assertFalse(p.isTerminating());
490 >            done.countDown();
491          } finally {
492 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
492 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
493          }
494 <        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
495 <        assertTrue(p1.isTerminated());
494 >        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
495 >        assertTrue(p.isTerminated());
496      }
497  
498      /**
499 <     *  isTerminating is not true when running or when terminated
499 >     * isTerminating is not true when running or when terminated
500       */
501      public void testIsTerminating() throws InterruptedException {
502 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
503 <        assertFalse(p1.isTerminating());
504 <        try {
505 <            p1.execute(new SmallRunnable());
506 <            assertFalse(p1.isTerminating());
507 <        } finally {
508 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
509 <        }
510 <
511 <        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
512 <        assertTrue(p1.isTerminated());
513 <        assertFalse(p1.isTerminating());
502 >        final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
503 >        final CountDownLatch threadStarted = new CountDownLatch(1);
504 >        final CountDownLatch done = new CountDownLatch(1);
505 >        try {
506 >            assertFalse(p.isTerminating());
507 >            p.execute(new CheckedRunnable() {
508 >                public void realRun() throws InterruptedException {
509 >                    assertFalse(p.isTerminating());
510 >                    threadStarted.countDown();
511 >                    done.await();
512 >                }});
513 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
514 >            assertFalse(p.isTerminating());
515 >            done.countDown();
516 >        } finally {
517 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
518 >        }
519 >        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
520 >        assertTrue(p.isTerminated());
521 >        assertFalse(p.isTerminating());
522      }
523  
524      /**
525       * getQueue returns the work queue, which contains queued tasks
526       */
527      public void testGetQueue() throws InterruptedException {
528 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
529 <        ScheduledFuture[] tasks = new ScheduledFuture[5];
530 <        for (int i = 0; i < 5; i++) {
412 <            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, MILLISECONDS);
413 <        }
528 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
529 >        final CountDownLatch threadStarted = new CountDownLatch(1);
530 >        final CountDownLatch done = new CountDownLatch(1);
531          try {
532 <            Thread.sleep(SHORT_DELAY_MS);
533 <            BlockingQueue<Runnable> q = p1.getQueue();
534 <            assertTrue(q.contains(tasks[4]));
532 >            ScheduledFuture[] tasks = new ScheduledFuture[5];
533 >            for (int i = 0; i < tasks.length; i++) {
534 >                Runnable r = new CheckedRunnable() {
535 >                    public void realRun() throws InterruptedException {
536 >                        threadStarted.countDown();
537 >                        done.await();
538 >                    }};
539 >                tasks[i] = p.schedule(r, 1, MILLISECONDS);
540 >            }
541 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
542 >            BlockingQueue<Runnable> q = p.getQueue();
543 >            assertTrue(q.contains(tasks[tasks.length - 1]));
544              assertFalse(q.contains(tasks[0]));
545          } finally {
546 <            joinPool(p1);
546 >            done.countDown();
547 >            joinPool(p);
548          }
549      }
550  
# Line 425 | Line 552 | public class ScheduledExecutorTest exten
552       * remove(task) removes queued task, and fails to remove active task
553       */
554      public void testRemove() throws InterruptedException {
555 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
555 >        final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
556          ScheduledFuture[] tasks = new ScheduledFuture[5];
557 <        for (int i = 0; i < 5; i++) {
558 <            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), 1, MILLISECONDS);
432 <        }
557 >        final CountDownLatch threadStarted = new CountDownLatch(1);
558 >        final CountDownLatch done = new CountDownLatch(1);
559          try {
560 <            Thread.sleep(SHORT_DELAY_MS);
561 <            BlockingQueue<Runnable> q = p1.getQueue();
562 <            assertFalse(p1.remove((Runnable)tasks[0]));
560 >            for (int i = 0; i < tasks.length; i++) {
561 >                Runnable r = new CheckedRunnable() {
562 >                    public void realRun() throws InterruptedException {
563 >                        threadStarted.countDown();
564 >                        done.await();
565 >                    }};
566 >                tasks[i] = p.schedule(r, 1, MILLISECONDS);
567 >            }
568 >            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
569 >            BlockingQueue<Runnable> q = p.getQueue();
570 >            assertFalse(p.remove((Runnable)tasks[0]));
571              assertTrue(q.contains((Runnable)tasks[4]));
572              assertTrue(q.contains((Runnable)tasks[3]));
573 <            assertTrue(p1.remove((Runnable)tasks[4]));
574 <            assertFalse(p1.remove((Runnable)tasks[4]));
573 >            assertTrue(p.remove((Runnable)tasks[4]));
574 >            assertFalse(p.remove((Runnable)tasks[4]));
575              assertFalse(q.contains((Runnable)tasks[4]));
576              assertTrue(q.contains((Runnable)tasks[3]));
577 <            assertTrue(p1.remove((Runnable)tasks[3]));
577 >            assertTrue(p.remove((Runnable)tasks[3]));
578              assertFalse(q.contains((Runnable)tasks[3]));
579          } finally {
580 <            joinPool(p1);
580 >            done.countDown();
581 >            joinPool(p);
582          }
583      }
584  
585      /**
586 <     *  purge removes cancelled tasks from the queue
586 >     * purge eventually removes cancelled tasks from the queue
587       */
588      public void testPurge() throws InterruptedException {
589 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
589 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
590          ScheduledFuture[] tasks = new ScheduledFuture[5];
591 <        for (int i = 0; i < 5; i++) {
592 <            tasks[i] = p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, MILLISECONDS);
593 <        }
591 >        for (int i = 0; i < tasks.length; i++)
592 >            tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
593 >                                  LONG_DELAY_MS, MILLISECONDS);
594          try {
595 <            int max = 5;
595 >            int max = tasks.length;
596              if (tasks[4].cancel(true)) --max;
597              if (tasks[3].cancel(true)) --max;
598              // There must eventually be an interference-free point at
599              // which purge will not fail. (At worst, when queue is empty.)
600 <            int k;
601 <            for (k = 0; k < SMALL_DELAY_MS; ++k) {
602 <                p1.purge();
603 <                long count = p1.getTaskCount();
604 <                if (count >= 0 && count <= max)
605 <                    break;
606 <                Thread.sleep(1);
607 <            }
473 <            assertTrue(k < SMALL_DELAY_MS);
600 >            long startTime = System.nanoTime();
601 >            do {
602 >                p.purge();
603 >                long count = p.getTaskCount();
604 >                if (count == max)
605 >                    return;
606 >            } while (millisElapsedSince(startTime) < MEDIUM_DELAY_MS);
607 >            fail("Purge failed to remove cancelled tasks");
608          } finally {
609 <            joinPool(p1);
609 >            for (ScheduledFuture task : tasks)
610 >                task.cancel(true);
611 >            joinPool(p);
612          }
613      }
614  
615      /**
616 <     *  shutDownNow returns a list containing tasks that were not run
616 >     * shutdownNow returns a list containing tasks that were not run
617       */
618 <    public void testShutDownNow() throws InterruptedException {
619 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
618 >    public void testShutdownNow() {
619 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
620          for (int i = 0; i < 5; i++)
621 <            p1.schedule(new SmallPossiblyInterruptedRunnable(), SHORT_DELAY_MS, MILLISECONDS);
622 <        List l;
621 >            p.schedule(new SmallPossiblyInterruptedRunnable(),
622 >                       LONG_DELAY_MS, MILLISECONDS);
623          try {
624 <            l = p1.shutdownNow();
624 >            List<Runnable> l = p.shutdownNow();
625 >            assertTrue(p.isShutdown());
626 >            assertEquals(5, l.size());
627          } catch (SecurityException ok) {
628 <            return;
628 >            // Allowed in case test doesn't have privs
629 >        } finally {
630 >            joinPool(p);
631          }
492        assertTrue(p1.isShutdown());
493        assertTrue(l.size() > 0 && l.size() <= 5);
494        joinPool(p1);
632      }
633  
634      /**
635       * In default setting, shutdown cancels periodic but not delayed
636       * tasks at shutdown
637       */
638 <    public void testShutDown1() throws InterruptedException {
639 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
640 <        assertTrue(p1.getExecuteExistingDelayedTasksAfterShutdownPolicy());
641 <        assertFalse(p1.getContinueExistingPeriodicTasksAfterShutdownPolicy());
638 >    public void testShutdown1() throws InterruptedException {
639 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
640 >        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
641 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
642  
643          ScheduledFuture[] tasks = new ScheduledFuture[5];
644 <        for (int i = 0; i < 5; i++)
645 <            tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, MILLISECONDS);
646 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
647 <        BlockingQueue q = p1.getQueue();
648 <        for (Iterator it = q.iterator(); it.hasNext();) {
649 <            ScheduledFuture t = (ScheduledFuture)it.next();
650 <            assertFalse(t.isCancelled());
651 <        }
652 <        assertTrue(p1.isShutdown());
653 <        Thread.sleep(SMALL_DELAY_MS);
654 <        for (int i = 0; i < 5; ++i) {
655 <            assertTrue(tasks[i].isDone());
656 <            assertFalse(tasks[i].isCancelled());
644 >        for (int i = 0; i < tasks.length; i++)
645 >            tasks[i] = p.schedule(new NoOpRunnable(),
646 >                                  SHORT_DELAY_MS, MILLISECONDS);
647 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
648 >        BlockingQueue<Runnable> q = p.getQueue();
649 >        for (ScheduledFuture task : tasks) {
650 >            assertFalse(task.isDone());
651 >            assertFalse(task.isCancelled());
652 >            assertTrue(q.contains(task));
653 >        }
654 >        assertTrue(p.isShutdown());
655 >        assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
656 >        assertTrue(p.isTerminated());
657 >        for (ScheduledFuture task : tasks) {
658 >            assertTrue(task.isDone());
659 >            assertFalse(task.isCancelled());
660          }
661      }
662  
523
663      /**
664       * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
665       * delayed tasks are cancelled at shutdown
666       */
667 <    public void testShutDown2() throws InterruptedException {
668 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
669 <        p1.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
667 >    public void testShutdown2() throws InterruptedException {
668 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
669 >        p.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
670 >        assertFalse(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
671 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
672          ScheduledFuture[] tasks = new ScheduledFuture[5];
673 <        for (int i = 0; i < 5; i++)
674 <            tasks[i] = p1.schedule(new NoOpRunnable(), SHORT_DELAY_MS, MILLISECONDS);
675 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
676 <        assertTrue(p1.isShutdown());
677 <        BlockingQueue q = p1.getQueue();
673 >        for (int i = 0; i < tasks.length; i++)
674 >            tasks[i] = p.schedule(new NoOpRunnable(),
675 >                                  SHORT_DELAY_MS, MILLISECONDS);
676 >        BlockingQueue q = p.getQueue();
677 >        assertEquals(tasks.length, q.size());
678 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
679 >        assertTrue(p.isShutdown());
680          assertTrue(q.isEmpty());
681 <        Thread.sleep(SMALL_DELAY_MS);
682 <        assertTrue(p1.isTerminated());
681 >        assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
682 >        assertTrue(p.isTerminated());
683 >        for (ScheduledFuture task : tasks) {
684 >            assertTrue(task.isDone());
685 >            assertTrue(task.isCancelled());
686 >        }
687      }
688  
542
689      /**
690       * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
691 <     * periodic tasks are not cancelled at shutdown
691 >     * periodic tasks are cancelled at shutdown
692       */
693 <    public void testShutDown3() throws InterruptedException {
694 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
695 <        p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
693 >    public void testShutdown3() throws InterruptedException {
694 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
695 >        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
696 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
697 >        p.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
698 >        assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
699 >        assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
700 >        long initialDelay = LONG_DELAY_MS;
701          ScheduledFuture task =
702 <            p1.scheduleAtFixedRate(new NoOpRunnable(), 5, 5, MILLISECONDS);
703 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
704 <        assertTrue(p1.isShutdown());
705 <        BlockingQueue q = p1.getQueue();
706 <        assertTrue(q.isEmpty());
707 <        Thread.sleep(SHORT_DELAY_MS);
708 <        assertTrue(p1.isTerminated());
702 >            p.scheduleAtFixedRate(new NoOpRunnable(), initialDelay,
703 >                                  5, MILLISECONDS);
704 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
705 >        assertTrue(p.isShutdown());
706 >        assertTrue(p.getQueue().isEmpty());
707 >        assertTrue(task.isDone());
708 >        assertTrue(task.isCancelled());
709 >        joinPool(p);
710      }
711  
712      /**
713       * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
714 <     * periodic tasks are cancelled at shutdown
714 >     * periodic tasks are not cancelled at shutdown
715       */
716 <    public void testShutDown4() throws InterruptedException {
717 <        ScheduledThreadPoolExecutor p1 = new ScheduledThreadPoolExecutor(1);
716 >    public void testShutdown4() throws InterruptedException {
717 >        ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
718 >        final CountDownLatch counter = new CountDownLatch(2);
719          try {
720 <            p1.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
720 >            p.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
721 >            assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
722 >            assertTrue(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
723 >            final Runnable r = new CheckedRunnable() {
724 >                public void realRun() {
725 >                    counter.countDown();
726 >                }};
727              ScheduledFuture task =
728 <                p1.scheduleAtFixedRate(new NoOpRunnable(), 1, 1, MILLISECONDS);
728 >                p.scheduleAtFixedRate(r, 1, 1, MILLISECONDS);
729 >            assertFalse(task.isDone());
730              assertFalse(task.isCancelled());
731 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
731 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
732              assertFalse(task.isCancelled());
733 <            assertFalse(p1.isTerminated());
734 <            assertTrue(p1.isShutdown());
735 <            Thread.sleep(SHORT_DELAY_MS);
733 >            assertFalse(p.isTerminated());
734 >            assertTrue(p.isShutdown());
735 >            assertTrue(counter.await(SMALL_DELAY_MS, MILLISECONDS));
736              assertFalse(task.isCancelled());
737 <            assertTrue(task.cancel(true));
737 >            assertTrue(task.cancel(false));
738              assertTrue(task.isDone());
739 <            Thread.sleep(SHORT_DELAY_MS);
740 <            assertTrue(p1.isTerminated());
739 >            assertTrue(task.isCancelled());
740 >            assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
741 >            assertTrue(p.isTerminated());
742          }
743          finally {
744 <            joinPool(p1);
744 >            joinPool(p);
745          }
746      }
747  
# Line 1009 | Line 1170 | public class ScheduledExecutorTest exten
1170          }
1171      }
1172  
1012
1173   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines