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

Comparing jsr166/src/test/tck/ForkJoinPoolTest.java (file contents):
Revision 1.19 by dl, Sun Feb 28 13:35:22 2010 UTC vs.
Revision 1.66 by jsr166, Tue Oct 6 23:16:51 2015 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   */
6  
7
8 import junit.framework.*;
9 import java.util.*;
10 import java.util.concurrent.*;
7   import static java.util.concurrent.TimeUnit.MILLISECONDS;
8 < import java.util.concurrent.locks.*;
9 < import java.security.*;
8 > import static java.util.concurrent.TimeUnit.NANOSECONDS;
9 >
10 > import java.security.PrivilegedAction;
11 > import java.security.PrivilegedExceptionAction;
12 > import java.util.ArrayList;
13 > import java.util.Collection;
14 > import java.util.List;
15 > import java.util.concurrent.Callable;
16 > import java.util.concurrent.CountDownLatch;
17 > import java.util.concurrent.ExecutionException;
18 > import java.util.concurrent.Executors;
19 > import java.util.concurrent.ExecutorService;
20 > import java.util.concurrent.ForkJoinPool;
21 > import java.util.concurrent.ForkJoinTask;
22 > import java.util.concurrent.ForkJoinWorkerThread;
23 > import java.util.concurrent.Future;
24 > import java.util.concurrent.RecursiveTask;
25 > import java.util.concurrent.RejectedExecutionException;
26 > import java.util.concurrent.atomic.AtomicBoolean;
27 > import java.util.concurrent.locks.ReentrantLock;
28 >
29 > import junit.framework.AssertionFailedError;
30 > import junit.framework.Test;
31 > import junit.framework.TestSuite;
32  
33   public class ForkJoinPoolTest extends JSR166TestCase {
34      public static void main(String[] args) {
35 <        junit.textui.TestRunner.run (suite());
35 >        main(suite(), args);
36      }
37 +
38      public static Test suite() {
39          return new TestSuite(ForkJoinPoolTest.class);
40      }
41  
42 <    /**
42 >    /*
43       * Testing coverage notes:
44       *
45       * 1. shutdown and related methods are tested via super.joinPool.
# Line 39 | Line 58 | public class ForkJoinPoolTest extends JS
58      // Some classes to test extension and factory methods
59  
60      static class MyHandler implements Thread.UncaughtExceptionHandler {
61 <        int catches = 0;
61 >        volatile int catches = 0;
62          public void uncaughtException(Thread t, Throwable e) {
63              ++catches;
64          }
65      }
66  
67 +    static class MyError extends Error {}
68 +
69      // to test handlers
70      static class FailingFJWSubclass extends ForkJoinWorkerThread {
71          public FailingFJWSubclass(ForkJoinPool p) { super(p) ; }
72 <        protected void onStart() { throw new Error(); }
72 >        protected void onStart() { super.onStart(); throw new MyError(); }
73      }
74  
75      static class FailingThreadFactory
76              implements ForkJoinPool.ForkJoinWorkerThreadFactory {
77 <        int calls = 0;
77 >        volatile int calls = 0;
78          public ForkJoinWorkerThread newThread(ForkJoinPool p) {
79              if (++calls > 1) return null;
80              return new FailingFJWSubclass(p);
# Line 88 | Line 109 | public class ForkJoinPoolTest extends JS
109      static final class FibTask extends RecursiveTask<Integer> {
110          final int number;
111          FibTask(int n) { number = n; }
112 <        public Integer compute() {
112 >        protected Integer compute() {
113              int n = number;
114              if (n <= 1)
115                  return n;
# Line 116 | Line 137 | public class ForkJoinPoolTest extends JS
137              this.locker = locker;
138              this.lock = lock;
139          }
140 <        public Integer compute() {
140 >        protected Integer compute() {
141              int n;
142              LockingFibTask f1 = null;
143              LockingFibTask f2 = null;
# Line 142 | Line 163 | public class ForkJoinPoolTest extends JS
163       * tasks, and quiescent running state.
164       */
165      public void testDefaultInitialState() {
166 <        ForkJoinPool p = null;
167 <        try {
168 <            p = new ForkJoinPool(1);
169 <            assertTrue(p.getFactory() ==
149 <                       ForkJoinPool.defaultForkJoinWorkerThreadFactory);
150 <            assertTrue(p.isQuiescent());
151 <            assertTrue(p.getMaintainsParallelism());
166 >        ForkJoinPool p = new ForkJoinPool(1);
167 >        try (PoolCleaner cleaner = cleaner(p)) {
168 >            assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory,
169 >                       p.getFactory());
170              assertFalse(p.getAsyncMode());
171 <            assertTrue(p.getActiveThreadCount() == 0);
172 <            assertTrue(p.getStealCount() == 0);
173 <            assertTrue(p.getQueuedTaskCount() == 0);
174 <            assertTrue(p.getQueuedSubmissionCount() == 0);
171 >            assertEquals(0, p.getActiveThreadCount());
172 >            assertEquals(0, p.getStealCount());
173 >            assertEquals(0, p.getQueuedTaskCount());
174 >            assertEquals(0, p.getQueuedSubmissionCount());
175              assertFalse(p.hasQueuedSubmissions());
176              assertFalse(p.isShutdown());
177              assertFalse(p.isTerminating());
178              assertFalse(p.isTerminated());
161        } finally {
162            joinPool(p);
179          }
180      }
181  
# Line 178 | Line 194 | public class ForkJoinPoolTest extends JS
194       */
195      public void testConstructor2() {
196          try {
197 <            new ForkJoinPool(1, null);
197 >            new ForkJoinPool(1, null, null, false);
198              shouldThrow();
199          } catch (NullPointerException success) {}
200      }
201  
186
202      /**
203       * getParallelism returns size set in constructor
204       */
205      public void testGetParallelism() {
206 <        ForkJoinPool p = null;
207 <        try {
208 <            p = new ForkJoinPool(1);
194 <            assertTrue(p.getParallelism() == 1);
195 <        } finally {
196 <            joinPool(p);
197 <        }
198 <    }
199 <
200 <    /**
201 <     * setParallelism changes reported parallelism level.
202 <     */
203 <    public void testSetParallelism() {
204 <        ForkJoinPool p = null;
205 <        try {
206 <            p = new ForkJoinPool(1);
207 <            assertTrue(p.getParallelism() == 1);
208 <            p.setParallelism(2);
209 <            assertTrue(p.getParallelism() == 2);
210 <        } finally {
211 <            joinPool(p);
212 <        }
213 <    }
214 <
215 <    /**
216 <     * setParallelism with argument <= 0 throws exception
217 <     */
218 <    public void testSetParallelism2() {
219 <        ForkJoinPool p = null;
220 <        try {
221 <            p = new ForkJoinPool(1);
222 <            assertTrue(p.getParallelism() == 1);
223 <            p.setParallelism(-2);
224 <            shouldThrow();
225 <        } catch (IllegalArgumentException success) {
226 <        } finally {
227 <            joinPool(p);
206 >        ForkJoinPool p = new ForkJoinPool(1);
207 >        try (PoolCleaner cleaner = cleaner(p)) {
208 >            assertEquals(1, p.getParallelism());
209          }
210      }
211  
# Line 232 | Line 213 | public class ForkJoinPoolTest extends JS
213       * getPoolSize returns number of started workers.
214       */
215      public void testGetPoolSize() {
216 <        ForkJoinPool p = null;
217 <        try {
218 <            p = new ForkJoinPool(1);
238 <            assertTrue(p.getActiveThreadCount() == 0);
216 >        ForkJoinPool p = new ForkJoinPool(1);
217 >        try (PoolCleaner cleaner = cleaner(p)) {
218 >            assertEquals(0, p.getActiveThreadCount());
219              Future<String> future = p.submit(new StringTask());
220 <            assertTrue(p.getPoolSize() == 1);
241 <
242 <        } finally {
243 <            joinPool(p);
244 <        }
245 <    }
246 <
247 <    /**
248 <     * setMaximumPoolSize changes size reported by getMaximumPoolSize.
249 <     */
250 <    public void testSetMaximumPoolSize() {
251 <        ForkJoinPool p = null;
252 <        try {
253 <            p = new ForkJoinPool(1);
254 <            p.setMaximumPoolSize(2);
255 <            assertTrue(p.getMaximumPoolSize() == 2);
256 <        } finally {
257 <            joinPool(p);
258 <        }
259 <    }
260 <
261 <    /**
262 <     * setMaximumPoolSize with argument <= 0 throws exception
263 <     */
264 <    public void testSetMaximumPoolSize2() {
265 <        ForkJoinPool p = null;
266 <        try {
267 <            p = new ForkJoinPool(1);
268 <            p.setMaximumPoolSize(-2);
269 <            shouldThrow();
270 <        } catch (IllegalArgumentException success) {
271 <        } finally {
272 <            joinPool(p);
273 <        }
274 <    }
275 <
276 <    /**
277 <     * setMaintainsParallelism changes policy reported by
278 <     * getMaintainsParallelism.
279 <     */
280 <    public void testSetMaintainsParallelism() {
281 <        ForkJoinPool p = null;
282 <        try {
283 <            p = new ForkJoinPool(1);
284 <            p.setMaintainsParallelism(false);
285 <            assertFalse(p.getMaintainsParallelism());
286 <        } finally {
287 <            joinPool(p);
220 >            assertEquals(1, p.getPoolSize());
221          }
222      }
223  
224      /**
225 <     * setAsyncMode changes policy reported by
293 <     * getAsyncMode.
225 >     * awaitTermination on a non-shutdown pool times out
226       */
227 <    public void testSetAsyncMode() {
228 <        ForkJoinPool p = null;
229 <        try {
230 <            p = new ForkJoinPool(1);
231 <            p.setAsyncMode(true);
232 <            assertTrue(p.getAsyncMode());
233 <        } finally {
234 <            joinPool(p);
227 >    public void testAwaitTermination_timesOut() throws InterruptedException {
228 >        ForkJoinPool p = new ForkJoinPool(1);
229 >        try (PoolCleaner cleaner = cleaner(p)) {
230 >            assertFalse(p.isTerminated());
231 >            assertFalse(p.awaitTermination(Long.MIN_VALUE, NANOSECONDS));
232 >            assertFalse(p.awaitTermination(Long.MIN_VALUE, MILLISECONDS));
233 >            assertFalse(p.awaitTermination(-1L, NANOSECONDS));
234 >            assertFalse(p.awaitTermination(-1L, MILLISECONDS));
235 >            assertFalse(p.awaitTermination(0L, NANOSECONDS));
236 >            assertFalse(p.awaitTermination(0L, MILLISECONDS));
237 >            long timeoutNanos = 999999L;
238 >            long startTime = System.nanoTime();
239 >            assertFalse(p.awaitTermination(timeoutNanos, NANOSECONDS));
240 >            assertTrue(System.nanoTime() - startTime >= timeoutNanos);
241 >            assertFalse(p.isTerminated());
242 >            startTime = System.nanoTime();
243 >            long timeoutMillis = timeoutMillis();
244 >            assertFalse(p.awaitTermination(timeoutMillis, MILLISECONDS));
245 >            assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
246 >            assertFalse(p.isTerminated());
247 >            p.shutdown();
248 >            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
249 >            assertTrue(p.isTerminated());
250          }
251      }
252  
# Line 310 | Line 257 | public class ForkJoinPoolTest extends JS
257       * performs its defined action
258       */
259      public void testSetUncaughtExceptionHandler() throws InterruptedException {
260 <        ForkJoinPool p = null;
261 <        try {
262 <            p = new ForkJoinPool(1, new FailingThreadFactory());
263 <            MyHandler eh = new MyHandler();
264 <            p.setUncaughtExceptionHandler(eh);
265 <            assertEquals(eh, p.getUncaughtExceptionHandler());
266 <            p.execute(new FailingTask());
267 <            Thread.sleep(MEDIUM_DELAY_MS);
268 <            assertTrue(eh.catches > 0);
269 <        } finally {
270 <            p.shutdownNow();
271 <            joinPool(p);
260 >        final CountDownLatch uehInvoked = new CountDownLatch(1);
261 >        final Thread.UncaughtExceptionHandler ueh =
262 >            new Thread.UncaughtExceptionHandler() {
263 >                public void uncaughtException(Thread t, Throwable e) {
264 >                    threadAssertTrue(e instanceof MyError);
265 >                    threadAssertTrue(t instanceof FailingFJWSubclass);
266 >                    uehInvoked.countDown();
267 >                }};
268 >        ForkJoinPool p = new ForkJoinPool(1, new FailingThreadFactory(),
269 >                                          ueh, false);
270 >        try (PoolCleaner cleaner = cleaner(p)) {
271 >            assertSame(ueh, p.getUncaughtExceptionHandler());
272 >            try {
273 >                p.execute(new FibTask(8));
274 >                await(uehInvoked);
275 >            } finally {
276 >                p.shutdownNow(); // failure might have prevented processing task
277 >            }
278          }
279      }
280  
281      /**
282 <     * setUncaughtExceptionHandler of null removes handler
283 <     */
284 <    public void testSetUncaughtExceptionHandler2() {
285 <        ForkJoinPool p = null;
286 <        try {
287 <            p = new ForkJoinPool(1);
288 <            p.setUncaughtExceptionHandler(null);
289 <            assertNull(p.getUncaughtExceptionHandler());
290 <        } finally {
291 <            joinPool(p);
292 <        }
293 <    }
294 <
282 >     * After invoking a single task, isQuiescent eventually becomes
283 >     * true, at which time queues are empty, threads are not active,
284 >     * the task has completed successfully, and construction
285 >     * parameters continue to hold
286 >     */
287 >    public void testIsQuiescent() throws Exception {
288 >        ForkJoinPool p = new ForkJoinPool(2);
289 >        try (PoolCleaner cleaner = cleaner(p)) {
290 >            assertTrue(p.isQuiescent());
291 >            long startTime = System.nanoTime();
292 >            FibTask f = new FibTask(20);
293 >            p.invoke(f);
294 >            assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory,
295 >                       p.getFactory());
296 >            while (! p.isQuiescent()) {
297 >                if (millisElapsedSince(startTime) > LONG_DELAY_MS)
298 >                    throw new AssertionFailedError("timed out");
299 >                assertFalse(p.getAsyncMode());
300 >                assertFalse(p.isShutdown());
301 >                assertFalse(p.isTerminating());
302 >                assertFalse(p.isTerminated());
303 >                Thread.yield();
304 >            }
305  
343    /**
344     * After invoking a single task, isQuiescent is true,
345     * queues are empty, threads are not active, and
346     * construction parameters continue to hold
347     */
348    public void testisQuiescent() throws InterruptedException {
349        ForkJoinPool p = null;
350        try {
351            p = new ForkJoinPool(2);
352            p.invoke(new FibTask(20));
353            assertTrue(p.getFactory() ==
354                       ForkJoinPool.defaultForkJoinWorkerThreadFactory);
355            Thread.sleep(MEDIUM_DELAY_MS);
306              assertTrue(p.isQuiescent());
357            assertTrue(p.getMaintainsParallelism());
307              assertFalse(p.getAsyncMode());
308 <            assertTrue(p.getActiveThreadCount() == 0);
309 <            assertTrue(p.getQueuedTaskCount() == 0);
310 <            assertTrue(p.getQueuedSubmissionCount() == 0);
308 >            assertEquals(0, p.getActiveThreadCount());
309 >            assertEquals(0, p.getQueuedTaskCount());
310 >            assertEquals(0, p.getQueuedSubmissionCount());
311              assertFalse(p.hasQueuedSubmissions());
312              assertFalse(p.isShutdown());
313              assertFalse(p.isTerminating());
314              assertFalse(p.isTerminated());
315 <        } finally {
316 <            joinPool(p);
315 >            assertTrue(f.isDone());
316 >            assertEquals(6765, (int) f.get());
317          }
318      }
319  
# Line 372 | Line 321 | public class ForkJoinPoolTest extends JS
321       * Completed submit(ForkJoinTask) returns result
322       */
323      public void testSubmitForkJoinTask() throws Throwable {
324 <        ForkJoinPool p = null;
325 <        try {
377 <            p = new ForkJoinPool(1);
324 >        ForkJoinPool p = new ForkJoinPool(1);
325 >        try (PoolCleaner cleaner = cleaner(p)) {
326              ForkJoinTask<Integer> f = p.submit(new FibTask(8));
327 <            int r = f.get();
380 <            assertTrue(r == 21);
381 <        } finally {
382 <            joinPool(p);
327 >            assertEquals(21, (int) f.get());
328          }
329      }
330  
# Line 387 | Line 332 | public class ForkJoinPoolTest extends JS
332       * A task submitted after shutdown is rejected
333       */
334      public void testSubmitAfterShutdown() {
335 <        ForkJoinPool p = null;
336 <        try {
392 <            p = new ForkJoinPool(1);
335 >        ForkJoinPool p = new ForkJoinPool(1);
336 >        try (PoolCleaner cleaner = cleaner(p)) {
337              p.shutdown();
338              assertTrue(p.isShutdown());
339 <            ForkJoinTask<Integer> f = p.submit(new FibTask(8));
340 <            shouldThrow();
341 <        } catch (RejectedExecutionException success) {
342 <        } finally {
399 <            joinPool(p);
339 >            try {
340 >                ForkJoinTask<Integer> f = p.submit(new FibTask(8));
341 >                shouldThrow();
342 >            } catch (RejectedExecutionException success) {}
343          }
344      }
345  
# Line 404 | Line 347 | public class ForkJoinPoolTest extends JS
347       * Pool maintains parallelism when using ManagedBlocker
348       */
349      public void testBlockingForkJoinTask() throws Throwable {
350 <        ForkJoinPool p = null;
350 >        ForkJoinPool p = new ForkJoinPool(4);
351          try {
409            p = new ForkJoinPool(4);
352              ReentrantLock lock = new ReentrantLock();
353              ManagedLocker locker = new ManagedLocker(lock);
354 <            ForkJoinTask<Integer> f = new LockingFibTask(30, locker, lock);
354 >            ForkJoinTask<Integer> f = new LockingFibTask(20, locker, lock);
355              p.execute(f);
356 <            assertTrue(p.getPoolSize() >= 4);
415 <            int r = f.get();
416 <            assertTrue(r == 832040);
356 >            assertEquals(6765, (int) f.get());
357          } finally {
358              p.shutdownNow(); // don't wait out shutdown
359          }
# Line 423 | Line 363 | public class ForkJoinPoolTest extends JS
363       * pollSubmission returns unexecuted submitted task, if present
364       */
365      public void testPollSubmission() {
366 <        SubFJP p = null;
367 <        try {
368 <            p = new SubFJP();
369 <            ForkJoinTask a = p.submit(new MediumRunnable());
370 <            ForkJoinTask b = p.submit(new MediumRunnable());
371 <            ForkJoinTask c = p.submit(new MediumRunnable());
366 >        final CountDownLatch done = new CountDownLatch(1);
367 >        SubFJP p = new SubFJP();
368 >        try (PoolCleaner cleaner = cleaner(p)) {
369 >            ForkJoinTask a = p.submit(awaiter(done));
370 >            ForkJoinTask b = p.submit(awaiter(done));
371 >            ForkJoinTask c = p.submit(awaiter(done));
372              ForkJoinTask r = p.pollSubmission();
373              assertTrue(r == a || r == b || r == c);
374              assertFalse(r.isDone());
375 <        } finally {
436 <            joinPool(p);
375 >            done.countDown();
376          }
377      }
378  
# Line 441 | Line 380 | public class ForkJoinPoolTest extends JS
380       * drainTasksTo transfers unexecuted submitted tasks, if present
381       */
382      public void testDrainTasksTo() {
383 <        SubFJP p = null;
384 <        try {
385 <            p = new SubFJP();
386 <            ForkJoinTask a = p.submit(new MediumRunnable());
387 <            ForkJoinTask b = p.submit(new MediumRunnable());
388 <            ForkJoinTask c = p.submit(new MediumRunnable());
383 >        final CountDownLatch done = new CountDownLatch(1);
384 >        SubFJP p = new SubFJP();
385 >        try (PoolCleaner cleaner = cleaner(p)) {
386 >            ForkJoinTask a = p.submit(awaiter(done));
387 >            ForkJoinTask b = p.submit(awaiter(done));
388 >            ForkJoinTask c = p.submit(awaiter(done));
389              ArrayList<ForkJoinTask> al = new ArrayList();
390              p.drainTasksTo(al);
391              assertTrue(al.size() > 0);
# Line 454 | Line 393 | public class ForkJoinPoolTest extends JS
393                  assertTrue(r == a || r == b || r == c);
394                  assertFalse(r.isDone());
395              }
396 <        } finally {
458 <            joinPool(p);
396 >            done.countDown();
397          }
398      }
399  
462
400      // FJ Versions of AbstractExecutorService tests
401  
402      /**
# Line 467 | Line 404 | public class ForkJoinPoolTest extends JS
404       */
405      public void testExecuteRunnable() throws Throwable {
406          ExecutorService e = new ForkJoinPool(1);
407 <        TrackedShortRunnable task = new TrackedShortRunnable();
408 <        assertFalse(task.done);
409 <        Future<?> future = e.submit(task);
410 <        future.get();
411 <        assertTrue(task.done);
407 >        try (PoolCleaner cleaner = cleaner(e)) {
408 >            final AtomicBoolean done = new AtomicBoolean(false);
409 >            Future<?> future = e.submit(new CheckedRunnable() {
410 >                public void realRun() {
411 >                    done.set(true);
412 >                }});
413 >            assertNull(future.get());
414 >            assertNull(future.get(0, MILLISECONDS));
415 >            assertTrue(done.get());
416 >            assertTrue(future.isDone());
417 >            assertFalse(future.isCancelled());
418 >        }
419      }
420  
477
421      /**
422       * Completed submit(callable) returns result
423       */
424      public void testSubmitCallable() throws Throwable {
425          ExecutorService e = new ForkJoinPool(1);
426 <        Future<String> future = e.submit(new StringTask());
427 <        String result = future.get();
428 <        assertSame(TEST_STRING, result);
426 >        try (PoolCleaner cleaner = cleaner(e)) {
427 >            Future<String> future = e.submit(new StringTask());
428 >            assertSame(TEST_STRING, future.get());
429 >            assertTrue(future.isDone());
430 >            assertFalse(future.isCancelled());
431 >        }
432      }
433  
434      /**
# Line 490 | Line 436 | public class ForkJoinPoolTest extends JS
436       */
437      public void testSubmitRunnable() throws Throwable {
438          ExecutorService e = new ForkJoinPool(1);
439 <        Future<?> future = e.submit(new NoOpRunnable());
440 <        future.get();
441 <        assertTrue(future.isDone());
439 >        try (PoolCleaner cleaner = cleaner(e)) {
440 >            Future<?> future = e.submit(new NoOpRunnable());
441 >            assertNull(future.get());
442 >            assertTrue(future.isDone());
443 >            assertFalse(future.isCancelled());
444 >        }
445      }
446  
447      /**
# Line 500 | Line 449 | public class ForkJoinPoolTest extends JS
449       */
450      public void testSubmitRunnable2() throws Throwable {
451          ExecutorService e = new ForkJoinPool(1);
452 <        Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
453 <        String result = future.get();
454 <        assertSame(TEST_STRING, result);
452 >        try (PoolCleaner cleaner = cleaner(e)) {
453 >            Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
454 >            assertSame(TEST_STRING, future.get());
455 >            assertTrue(future.isDone());
456 >            assertFalse(future.isCancelled());
457 >        }
458      }
459  
460      /**
461       * A submitted privileged action runs to completion
462       */
463 <    public void testSubmitPrivilegedAction() throws Throwable {
463 >    public void testSubmitPrivilegedAction() throws Exception {
464 >        final Callable callable = Executors.callable(new PrivilegedAction() {
465 >                public Object run() { return TEST_STRING; }});
466          Runnable r = new CheckedRunnable() {
467 <            public void realRun() throws Exception {
468 <                ExecutorService e = new ForkJoinPool(1);
469 <                Future future = e.submit(Executors.callable(new PrivilegedAction() {
470 <                    public Object run() {
471 <                        return TEST_STRING;
472 <                    }}));
473 <
520 <                Object result = future.get();
521 <                assertSame(TEST_STRING, result);
522 <            }};
467 >        public void realRun() throws Exception {
468 >            ExecutorService e = new ForkJoinPool(1);
469 >            try (PoolCleaner cleaner = cleaner(e)) {
470 >                Future future = e.submit(callable);
471 >                assertSame(TEST_STRING, future.get());
472 >            }
473 >        }};
474  
475          runWithPermissions(r, new RuntimePermission("modifyThread"));
476      }
# Line 527 | Line 478 | public class ForkJoinPoolTest extends JS
478      /**
479       * A submitted privileged exception action runs to completion
480       */
481 <    public void testSubmitPrivilegedExceptionAction() throws Throwable {
481 >    public void testSubmitPrivilegedExceptionAction() throws Exception {
482 >        final Callable callable =
483 >            Executors.callable(new PrivilegedExceptionAction() {
484 >                public Object run() { return TEST_STRING; }});
485          Runnable r = new CheckedRunnable() {
486 <            public void realRun() throws Exception {
487 <                ExecutorService e = new ForkJoinPool(1);
488 <                Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
489 <                    public Object run() {
490 <                        return TEST_STRING;
491 <                    }}));
492 <
539 <                Object result = future.get();
540 <                assertSame(TEST_STRING, result);
541 <            }};
486 >        public void realRun() throws Exception {
487 >            ExecutorService e = new ForkJoinPool(1);
488 >            try (PoolCleaner cleaner = cleaner(e)) {
489 >                Future future = e.submit(callable);
490 >                assertSame(TEST_STRING, future.get());
491 >            }
492 >        }};
493  
494          runWithPermissions(r, new RuntimePermission("modifyThread"));
495      }
# Line 546 | Line 497 | public class ForkJoinPoolTest extends JS
497      /**
498       * A submitted failed privileged exception action reports exception
499       */
500 <    public void testSubmitFailedPrivilegedExceptionAction() throws Throwable {
500 >    public void testSubmitFailedPrivilegedExceptionAction() throws Exception {
501 >        final Callable callable =
502 >            Executors.callable(new PrivilegedExceptionAction() {
503 >                public Object run() { throw new IndexOutOfBoundsException(); }});
504          Runnable r = new CheckedRunnable() {
505 <            public void realRun() throws Exception {
506 <                ExecutorService e = new ForkJoinPool(1);
507 <                Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
508 <                    public Object run() throws Exception {
555 <                        throw new IndexOutOfBoundsException();
556 <                    }}));
557 <
505 >        public void realRun() throws Exception {
506 >            ExecutorService e = new ForkJoinPool(1);
507 >            try (PoolCleaner cleaner = cleaner(e)) {
508 >                Future future = e.submit(callable);
509                  try {
510 <                    Object result = future.get();
510 >                    future.get();
511                      shouldThrow();
512                  } catch (ExecutionException success) {
513                      assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
514 <                }}};
514 >                }
515 >            }
516 >        }};
517  
518          runWithPermissions(r, new RuntimePermission("modifyThread"));
519      }
# Line 569 | Line 522 | public class ForkJoinPoolTest extends JS
522       * execute(null runnable) throws NullPointerException
523       */
524      public void testExecuteNullRunnable() {
525 <        try {
526 <            ExecutorService e = new ForkJoinPool(1);
527 <            TrackedShortRunnable task = null;
528 <            Future<?> future = e.submit(task);
529 <            shouldThrow();
530 <        } catch (NullPointerException success) {}
525 >        ExecutorService e = new ForkJoinPool(1);
526 >        try (PoolCleaner cleaner = cleaner(e)) {
527 >            try {
528 >                Future<?> future = e.submit((Runnable) null);
529 >                shouldThrow();
530 >            } catch (NullPointerException success) {}
531 >        }
532      }
533  
580
534      /**
535       * submit(null callable) throws NullPointerException
536       */
537      public void testSubmitNullCallable() {
538 <        try {
539 <            ExecutorService e = new ForkJoinPool(1);
540 <            StringTask t = null;
541 <            Future<String> future = e.submit(t);
542 <            shouldThrow();
543 <        } catch (NullPointerException success) {}
538 >        ExecutorService e = new ForkJoinPool(1);
539 >        try (PoolCleaner cleaner = cleaner(e)) {
540 >            try {
541 >                Future<String> future = e.submit((Callable) null);
542 >                shouldThrow();
543 >            } catch (NullPointerException success) {}
544 >        }
545      }
546  
593
547      /**
548 <     * Blocking on submit(callable) throws InterruptedException if
596 <     * caller interrupted.
548 >     * submit(callable).get() throws InterruptedException if interrupted
549       */
550      public void testInterruptedSubmit() throws InterruptedException {
551 <        final ForkJoinPool p = new ForkJoinPool(1);
552 <
553 <        Thread t = new Thread(new CheckedInterruptedRunnable() {
554 <            public void realRun() throws Throwable {
555 <                p.submit(new CheckedCallable<Object>() {
556 <                    public Object realCall() throws Throwable {
557 <                        try {
558 <                            Thread.sleep(MEDIUM_DELAY_MS);
559 <                        } catch (InterruptedException ok) {
560 <                        }
561 <                        return null;
562 <                    }}).get();
563 <            }});
564 <
565 <        t.start();
566 <        Thread.sleep(SHORT_DELAY_MS);
567 <        t.interrupt();
568 <        t.join();
569 <        p.shutdownNow();
570 <        joinPool(p);
551 >        final CountDownLatch submitted    = new CountDownLatch(1);
552 >        final CountDownLatch quittingTime = new CountDownLatch(1);
553 >        final Callable<Void> awaiter = new CheckedCallable<Void>() {
554 >            public Void realCall() throws InterruptedException {
555 >                assertTrue(quittingTime.await(2*LONG_DELAY_MS, MILLISECONDS));
556 >                return null;
557 >            }};
558 >        final ExecutorService p = new ForkJoinPool(1);
559 >        try (PoolCleaner cleaner = cleaner(p, quittingTime)) {
560 >            Thread t = new Thread(new CheckedInterruptedRunnable() {
561 >                public void realRun() throws Exception {
562 >                    Future<Void> future = p.submit(awaiter);
563 >                    submitted.countDown();
564 >                    future.get();
565 >                }});
566 >            t.start();
567 >            await(submitted);
568 >            t.interrupt();
569 >            awaitTermination(t);
570 >        }
571      }
572  
573      /**
# Line 624 | Line 576 | public class ForkJoinPoolTest extends JS
576       */
577      public void testSubmitEE() throws Throwable {
578          ForkJoinPool p = new ForkJoinPool(1);
579 <        try {
580 <            p.submit(new Callable() {
581 <                public Object call() {
582 <                    int i = 5/0;
583 <                    return Boolean.TRUE;
584 <                }}).get();
585 <            shouldThrow();
586 <        } catch (ExecutionException success) {
587 <            assertTrue(success.getCause() instanceof ArithmeticException);
579 >        try (PoolCleaner cleaner = cleaner(p)) {
580 >            try {
581 >                p.submit(new Callable() {
582 >                        public Object call() { throw new ArithmeticException(); }})
583 >                    .get();
584 >                shouldThrow();
585 >            } catch (ExecutionException success) {
586 >                assertTrue(success.getCause() instanceof ArithmeticException);
587 >            }
588          }
637
638        joinPool(p);
589      }
590  
591      /**
# Line 643 | Line 593 | public class ForkJoinPoolTest extends JS
593       */
594      public void testInvokeAny1() throws Throwable {
595          ExecutorService e = new ForkJoinPool(1);
596 <        try {
597 <            e.invokeAny(null);
598 <            shouldThrow();
599 <        } catch (NullPointerException success) {
600 <        } finally {
651 <            joinPool(e);
596 >        try (PoolCleaner cleaner = cleaner(e)) {
597 >            try {
598 >                e.invokeAny(null);
599 >                shouldThrow();
600 >            } catch (NullPointerException success) {}
601          }
602      }
603  
# Line 657 | Line 606 | public class ForkJoinPoolTest extends JS
606       */
607      public void testInvokeAny2() throws Throwable {
608          ExecutorService e = new ForkJoinPool(1);
609 <        try {
610 <            e.invokeAny(new ArrayList<Callable<String>>());
611 <            shouldThrow();
612 <        } catch (IllegalArgumentException success) {
613 <        } finally {
665 <            joinPool(e);
609 >        try (PoolCleaner cleaner = cleaner(e)) {
610 >            try {
611 >                e.invokeAny(new ArrayList<Callable<String>>());
612 >                shouldThrow();
613 >            } catch (IllegalArgumentException success) {}
614          }
615      }
616  
# Line 671 | Line 619 | public class ForkJoinPoolTest extends JS
619       */
620      public void testInvokeAny3() throws Throwable {
621          ExecutorService e = new ForkJoinPool(1);
622 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
623 <        l.add(null);
624 <        try {
625 <            e.invokeAny(l);
626 <            shouldThrow();
627 <        } catch (NullPointerException success) {
628 <        } finally {
681 <            joinPool(e);
622 >        try (PoolCleaner cleaner = cleaner(e)) {
623 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
624 >            l.add(null);
625 >            try {
626 >                e.invokeAny(l);
627 >                shouldThrow();
628 >            } catch (NullPointerException success) {}
629          }
630      }
631  
# Line 688 | Line 635 | public class ForkJoinPoolTest extends JS
635      public void testInvokeAny4() throws Throwable {
636          CountDownLatch latch = new CountDownLatch(1);
637          ExecutorService e = new ForkJoinPool(1);
638 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
639 <        l.add(latchAwaitingStringTask(latch));
640 <        l.add(null);
641 <        try {
642 <            e.invokeAny(l);
643 <            shouldThrow();
644 <        } catch (NullPointerException success) {
645 <        } finally {
638 >        try (PoolCleaner cleaner = cleaner(e)) {
639 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
640 >            l.add(latchAwaitingStringTask(latch));
641 >            l.add(null);
642 >            try {
643 >                e.invokeAny(l);
644 >                shouldThrow();
645 >            } catch (NullPointerException success) {}
646              latch.countDown();
700            joinPool(e);
647          }
648      }
649  
# Line 706 | Line 652 | public class ForkJoinPoolTest extends JS
652       */
653      public void testInvokeAny5() throws Throwable {
654          ExecutorService e = new ForkJoinPool(1);
655 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
656 <        l.add(new NPETask());
657 <        try {
658 <            e.invokeAny(l);
659 <            shouldThrow();
660 <        } catch (ExecutionException success) {
661 <            assertTrue(success.getCause() instanceof NullPointerException);
662 <        } finally {
663 <            joinPool(e);
655 >        try (PoolCleaner cleaner = cleaner(e)) {
656 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
657 >            l.add(new NPETask());
658 >            try {
659 >                e.invokeAny(l);
660 >                shouldThrow();
661 >            } catch (ExecutionException success) {
662 >                assertTrue(success.getCause() instanceof NullPointerException);
663 >            }
664          }
665      }
666  
# Line 723 | Line 669 | public class ForkJoinPoolTest extends JS
669       */
670      public void testInvokeAny6() throws Throwable {
671          ExecutorService e = new ForkJoinPool(1);
672 <        try {
672 >        try (PoolCleaner cleaner = cleaner(e)) {
673              List<Callable<String>> l = new ArrayList<Callable<String>>();
674              l.add(new StringTask());
675              l.add(new StringTask());
676              String result = e.invokeAny(l);
677              assertSame(TEST_STRING, result);
732        } finally {
733            joinPool(e);
678          }
679      }
680  
# Line 739 | Line 683 | public class ForkJoinPoolTest extends JS
683       */
684      public void testInvokeAll1() throws Throwable {
685          ExecutorService e = new ForkJoinPool(1);
686 <        try {
687 <            e.invokeAll(null);
688 <            shouldThrow();
689 <        } catch (NullPointerException success) {
690 <        } finally {
747 <            joinPool(e);
686 >        try (PoolCleaner cleaner = cleaner(e)) {
687 >            try {
688 >                e.invokeAll(null);
689 >                shouldThrow();
690 >            } catch (NullPointerException success) {}
691          }
692      }
693  
# Line 753 | Line 696 | public class ForkJoinPoolTest extends JS
696       */
697      public void testInvokeAll2() throws InterruptedException {
698          ExecutorService e = new ForkJoinPool(1);
699 <        try {
699 >        try (PoolCleaner cleaner = cleaner(e)) {
700              List<Future<String>> r
701                  = e.invokeAll(new ArrayList<Callable<String>>());
702              assertTrue(r.isEmpty());
760        } finally {
761            joinPool(e);
703          }
704      }
705  
# Line 767 | Line 708 | public class ForkJoinPoolTest extends JS
708       */
709      public void testInvokeAll3() throws InterruptedException {
710          ExecutorService e = new ForkJoinPool(1);
711 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
712 <        l.add(new StringTask());
713 <        l.add(null);
714 <        try {
715 <            e.invokeAll(l);
716 <            shouldThrow();
717 <        } catch (NullPointerException success) {
718 <        } finally {
778 <            joinPool(e);
711 >        try (PoolCleaner cleaner = cleaner(e)) {
712 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
713 >            l.add(new StringTask());
714 >            l.add(null);
715 >            try {
716 >                e.invokeAll(l);
717 >                shouldThrow();
718 >            } catch (NullPointerException success) {}
719          }
720      }
721  
# Line 785 | Line 725 | public class ForkJoinPoolTest extends JS
725       */
726      public void testInvokeAll4() throws Throwable {
727          ExecutorService e = new ForkJoinPool(1);
728 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
729 <        l.add(new NPETask());
730 <        List<Future<String>> futures = e.invokeAll(l);
731 <        assertEquals(1, futures.size());
732 <        try {
733 <            futures.get(0).get();
734 <            shouldThrow();
735 <        } catch (ExecutionException success) {
736 <            assertTrue(success.getCause() instanceof NullPointerException);
737 <        } finally {
738 <            joinPool(e);
728 >        try (PoolCleaner cleaner = cleaner(e)) {
729 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
730 >            l.add(new NPETask());
731 >            List<Future<String>> futures = e.invokeAll(l);
732 >            assertEquals(1, futures.size());
733 >            try {
734 >                futures.get(0).get();
735 >                shouldThrow();
736 >            } catch (ExecutionException success) {
737 >                assertTrue(success.getCause() instanceof NullPointerException);
738 >            }
739          }
740      }
741  
# Line 804 | Line 744 | public class ForkJoinPoolTest extends JS
744       */
745      public void testInvokeAll5() throws Throwable {
746          ExecutorService e = new ForkJoinPool(1);
747 <        try {
747 >        try (PoolCleaner cleaner = cleaner(e)) {
748              List<Callable<String>> l = new ArrayList<Callable<String>>();
749              l.add(new StringTask());
750              l.add(new StringTask());
# Line 812 | Line 752 | public class ForkJoinPoolTest extends JS
752              assertEquals(2, futures.size());
753              for (Future<String> future : futures)
754                  assertSame(TEST_STRING, future.get());
815        } finally {
816            joinPool(e);
755          }
756      }
757  
820
758      /**
759       * timed invokeAny(null) throws NullPointerException
760       */
761      public void testTimedInvokeAny1() throws Throwable {
762          ExecutorService e = new ForkJoinPool(1);
763 <        try {
764 <            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
765 <            shouldThrow();
766 <        } catch (NullPointerException success) {
767 <        } finally {
831 <            joinPool(e);
763 >        try (PoolCleaner cleaner = cleaner(e)) {
764 >            try {
765 >                e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
766 >                shouldThrow();
767 >            } catch (NullPointerException success) {}
768          }
769      }
770  
# Line 837 | Line 773 | public class ForkJoinPoolTest extends JS
773       */
774      public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
775          ExecutorService e = new ForkJoinPool(1);
776 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
777 <        l.add(new StringTask());
778 <        try {
779 <            e.invokeAny(l, MEDIUM_DELAY_MS, null);
780 <            shouldThrow();
781 <        } catch (NullPointerException success) {
782 <        } finally {
847 <            joinPool(e);
776 >        try (PoolCleaner cleaner = cleaner(e)) {
777 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
778 >            l.add(new StringTask());
779 >            try {
780 >                e.invokeAny(l, MEDIUM_DELAY_MS, null);
781 >                shouldThrow();
782 >            } catch (NullPointerException success) {}
783          }
784      }
785  
# Line 853 | Line 788 | public class ForkJoinPoolTest extends JS
788       */
789      public void testTimedInvokeAny2() throws Throwable {
790          ExecutorService e = new ForkJoinPool(1);
791 <        try {
792 <            e.invokeAny(new ArrayList<Callable<String>>(),
793 <                        MEDIUM_DELAY_MS, MILLISECONDS);
794 <            shouldThrow();
795 <        } catch (IllegalArgumentException success) {
796 <        } finally {
862 <            joinPool(e);
791 >        try (PoolCleaner cleaner = cleaner(e)) {
792 >            try {
793 >                e.invokeAny(new ArrayList<Callable<String>>(),
794 >                            MEDIUM_DELAY_MS, MILLISECONDS);
795 >                shouldThrow();
796 >            } catch (IllegalArgumentException success) {}
797          }
798      }
799  
# Line 869 | Line 803 | public class ForkJoinPoolTest extends JS
803      public void testTimedInvokeAny3() throws Throwable {
804          CountDownLatch latch = new CountDownLatch(1);
805          ExecutorService e = new ForkJoinPool(1);
806 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
807 <        l.add(latchAwaitingStringTask(latch));
808 <        l.add(null);
809 <        try {
810 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
811 <            shouldThrow();
812 <        } catch (NullPointerException success) {
813 <        } finally {
806 >        try (PoolCleaner cleaner = cleaner(e)) {
807 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
808 >            l.add(latchAwaitingStringTask(latch));
809 >            l.add(null);
810 >            try {
811 >                e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
812 >                shouldThrow();
813 >            } catch (NullPointerException success) {}
814              latch.countDown();
881            joinPool(e);
815          }
816      }
817  
# Line 887 | Line 820 | public class ForkJoinPoolTest extends JS
820       */
821      public void testTimedInvokeAny4() throws Throwable {
822          ExecutorService e = new ForkJoinPool(1);
823 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
824 <        l.add(new NPETask());
825 <        try {
826 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
827 <            shouldThrow();
828 <        } catch (ExecutionException success) {
829 <            assertTrue(success.getCause() instanceof NullPointerException);
830 <        } finally {
831 <            joinPool(e);
823 >        try (PoolCleaner cleaner = cleaner(e)) {
824 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
825 >            l.add(new NPETask());
826 >            try {
827 >                e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
828 >                shouldThrow();
829 >            } catch (ExecutionException success) {
830 >                assertTrue(success.getCause() instanceof NullPointerException);
831 >            }
832          }
833      }
834  
# Line 904 | Line 837 | public class ForkJoinPoolTest extends JS
837       */
838      public void testTimedInvokeAny5() throws Throwable {
839          ExecutorService e = new ForkJoinPool(1);
840 <        try {
840 >        try (PoolCleaner cleaner = cleaner(e)) {
841              List<Callable<String>> l = new ArrayList<Callable<String>>();
842              l.add(new StringTask());
843              l.add(new StringTask());
844              String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
845              assertSame(TEST_STRING, result);
913        } finally {
914            joinPool(e);
846          }
847      }
848  
# Line 920 | Line 851 | public class ForkJoinPoolTest extends JS
851       */
852      public void testTimedInvokeAll1() throws Throwable {
853          ExecutorService e = new ForkJoinPool(1);
854 <        try {
855 <            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
856 <            shouldThrow();
857 <        } catch (NullPointerException success) {
858 <        } finally {
928 <            joinPool(e);
854 >        try (PoolCleaner cleaner = cleaner(e)) {
855 >            try {
856 >                e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
857 >                shouldThrow();
858 >            } catch (NullPointerException success) {}
859          }
860      }
861  
# Line 934 | Line 864 | public class ForkJoinPoolTest extends JS
864       */
865      public void testTimedInvokeAllNullTimeUnit() throws Throwable {
866          ExecutorService e = new ForkJoinPool(1);
867 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
868 <        l.add(new StringTask());
869 <        try {
870 <            e.invokeAll(l, MEDIUM_DELAY_MS, null);
871 <            shouldThrow();
872 <        } catch (NullPointerException success) {
873 <        } finally {
944 <            joinPool(e);
867 >        try (PoolCleaner cleaner = cleaner(e)) {
868 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
869 >            l.add(new StringTask());
870 >            try {
871 >                e.invokeAll(l, MEDIUM_DELAY_MS, null);
872 >                shouldThrow();
873 >            } catch (NullPointerException success) {}
874          }
875      }
876  
# Line 950 | Line 879 | public class ForkJoinPoolTest extends JS
879       */
880      public void testTimedInvokeAll2() throws InterruptedException {
881          ExecutorService e = new ForkJoinPool(1);
882 <        try {
882 >        try (PoolCleaner cleaner = cleaner(e)) {
883              List<Future<String>> r
884                  = e.invokeAll(new ArrayList<Callable<String>>(),
885                                MEDIUM_DELAY_MS, MILLISECONDS);
886              assertTrue(r.isEmpty());
958        } finally {
959            joinPool(e);
887          }
888      }
889  
# Line 965 | Line 892 | public class ForkJoinPoolTest extends JS
892       */
893      public void testTimedInvokeAll3() throws InterruptedException {
894          ExecutorService e = new ForkJoinPool(1);
895 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
896 <        l.add(new StringTask());
897 <        l.add(null);
898 <        try {
899 <            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
900 <            shouldThrow();
901 <        } catch (NullPointerException success) {
902 <        } finally {
976 <            joinPool(e);
895 >        try (PoolCleaner cleaner = cleaner(e)) {
896 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
897 >            l.add(new StringTask());
898 >            l.add(null);
899 >            try {
900 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
901 >                shouldThrow();
902 >            } catch (NullPointerException success) {}
903          }
904      }
905  
# Line 982 | Line 908 | public class ForkJoinPoolTest extends JS
908       */
909      public void testTimedInvokeAll4() throws Throwable {
910          ExecutorService e = new ForkJoinPool(1);
911 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
912 <        l.add(new NPETask());
913 <        List<Future<String>> futures
914 <            = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
915 <        assertEquals(1, futures.size());
916 <        try {
917 <            futures.get(0).get();
918 <            shouldThrow();
919 <        } catch (ExecutionException success) {
920 <            assertTrue(success.getCause() instanceof NullPointerException);
921 <        } finally {
922 <            joinPool(e);
911 >        try (PoolCleaner cleaner = cleaner(e)) {
912 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
913 >            l.add(new NPETask());
914 >            List<Future<String>> futures
915 >                = e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
916 >            assertEquals(1, futures.size());
917 >            try {
918 >                futures.get(0).get();
919 >                shouldThrow();
920 >            } catch (ExecutionException success) {
921 >                assertTrue(success.getCause() instanceof NullPointerException);
922 >            }
923          }
924      }
925  
# Line 1001 | Line 927 | public class ForkJoinPoolTest extends JS
927       * timed invokeAll(c) returns results of all completed tasks in c
928       */
929      public void testTimedInvokeAll5() throws Throwable {
930 <        ExecutorService e = new ForkJoinPool(1);
931 <        try {
930 >        ForkJoinPool e = new ForkJoinPool(1);
931 >        try (PoolCleaner cleaner = cleaner(e)) {
932              List<Callable<String>> l = new ArrayList<Callable<String>>();
933              l.add(new StringTask());
934              l.add(new StringTask());
935              List<Future<String>> futures
936 <                = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
936 >                = e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
937              assertEquals(2, futures.size());
938              for (Future<String> future : futures)
939                  assertSame(TEST_STRING, future.get());
1014        } finally {
1015            joinPool(e);
940          }
941      }
942  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines