ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AbstractExecutorServiceTest.java
Revision: 1.43
Committed: Thu Oct 8 03:03:36 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.42: +3 -1 lines
Log Message:
improve testTimedInvokeAny4

File Contents

# User Rev Content
1 tim 1.1 /*
2 dl 1.10 * 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 jsr166 1.30 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.16 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 tim 1.1 */
8    
9 jsr166 1.35 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.security.PrivilegedAction;
12     import java.security.PrivilegedExceptionAction;
13     import java.util.ArrayList;
14     import java.util.Collections;
15     import java.util.List;
16     import java.util.concurrent.AbstractExecutorService;
17     import java.util.concurrent.ArrayBlockingQueue;
18     import java.util.concurrent.Callable;
19 jsr166 1.38 import java.util.concurrent.CancellationException;
20 jsr166 1.35 import java.util.concurrent.CountDownLatch;
21     import java.util.concurrent.ExecutionException;
22     import java.util.concurrent.Executors;
23     import java.util.concurrent.ExecutorService;
24     import java.util.concurrent.Future;
25     import java.util.concurrent.ThreadPoolExecutor;
26     import java.util.concurrent.TimeUnit;
27 jsr166 1.32 import java.util.concurrent.atomic.AtomicBoolean;
28 jsr166 1.35
29     import junit.framework.Test;
30     import junit.framework.TestSuite;
31 tim 1.1
32 jsr166 1.18 public class AbstractExecutorServiceTest extends JSR166TestCase {
33 tim 1.1 public static void main(String[] args) {
34 jsr166 1.37 main(suite(), args);
35 tim 1.1 }
36     public static Test suite() {
37 dl 1.6 return new TestSuite(AbstractExecutorServiceTest.class);
38 tim 1.1 }
39    
40 jsr166 1.16 /**
41 tim 1.1 * A no-frills implementation of AbstractExecutorService, designed
42 dl 1.6 * to test the submit methods only.
43 tim 1.1 */
44     static class DirectExecutorService extends AbstractExecutorService {
45     public void execute(Runnable r) { r.run(); }
46     public void shutdown() { shutdown = true; }
47 jsr166 1.26 public List<Runnable> shutdownNow() {
48     shutdown = true;
49     return Collections.EMPTY_LIST;
50     }
51 tim 1.1 public boolean isShutdown() { return shutdown; }
52     public boolean isTerminated() { return isShutdown(); }
53 jsr166 1.26 public boolean awaitTermination(long timeout, TimeUnit unit) {
54     return isShutdown();
55     }
56 tim 1.1 private volatile boolean shutdown = false;
57     }
58    
59     /**
60 dl 1.12 * execute(runnable) runs it to completion
61 tim 1.1 */
62 jsr166 1.19 public void testExecuteRunnable() throws Exception {
63     ExecutorService e = new DirectExecutorService();
64 jsr166 1.32 final AtomicBoolean done = new AtomicBoolean(false);
65 jsr166 1.34 Future<?> future = e.submit(new CheckedRunnable() {
66 jsr166 1.32 public void realRun() {
67     done.set(true);
68 jsr166 1.34 }});
69 jsr166 1.32 assertNull(future.get());
70     assertNull(future.get(0, MILLISECONDS));
71     assertTrue(done.get());
72     assertTrue(future.isDone());
73     assertFalse(future.isCancelled());
74 tim 1.1 }
75    
76     /**
77 dl 1.12 * Completed submit(callable) returns result
78 tim 1.1 */
79 jsr166 1.19 public void testSubmitCallable() throws Exception {
80     ExecutorService e = new DirectExecutorService();
81     Future<String> future = e.submit(new StringTask());
82     String result = future.get();
83     assertSame(TEST_STRING, result);
84 tim 1.1 }
85    
86 dl 1.6 /**
87 dl 1.12 * Completed submit(runnable) returns successfully
88 dl 1.6 */
89 jsr166 1.19 public void testSubmitRunnable() throws Exception {
90     ExecutorService e = new DirectExecutorService();
91     Future<?> future = e.submit(new NoOpRunnable());
92     future.get();
93     assertTrue(future.isDone());
94 dl 1.6 }
95    
96     /**
97 dl 1.12 * Completed submit(runnable, result) returns result
98 dl 1.6 */
99 jsr166 1.19 public void testSubmitRunnable2() throws Exception {
100     ExecutorService e = new DirectExecutorService();
101     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
102     String result = future.get();
103     assertSame(TEST_STRING, result);
104 dl 1.6 }
105    
106 tim 1.1 /**
107 jsr166 1.23 * A submitted privileged action runs to completion
108 tim 1.1 */
109 jsr166 1.19 public void testSubmitPrivilegedAction() throws Exception {
110 jsr166 1.23 Runnable r = new CheckedRunnable() {
111     public void realRun() throws Exception {
112     ExecutorService e = new DirectExecutorService();
113     Future future = e.submit(Executors.callable(new PrivilegedAction() {
114 tim 1.1 public Object run() {
115     return TEST_STRING;
116 dl 1.5 }}));
117 tim 1.1
118 jsr166 1.23 assertSame(TEST_STRING, future.get());
119     }};
120    
121     runWithPermissions(r,
122     new RuntimePermission("getClassLoader"),
123     new RuntimePermission("setContextClassLoader"),
124     new RuntimePermission("modifyThread"));
125 tim 1.1 }
126    
127     /**
128 jsr166 1.23 * A submitted privileged exception action runs to completion
129 tim 1.1 */
130 jsr166 1.19 public void testSubmitPrivilegedExceptionAction() throws Exception {
131 jsr166 1.23 Runnable r = new CheckedRunnable() {
132     public void realRun() throws Exception {
133     ExecutorService e = new DirectExecutorService();
134     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
135 tim 1.1 public Object run() {
136     return TEST_STRING;
137 dl 1.5 }}));
138 tim 1.1
139 jsr166 1.23 assertSame(TEST_STRING, future.get());
140     }};
141    
142     runWithPermissions(r);
143 tim 1.1 }
144    
145     /**
146 dl 1.12 * A submitted failed privileged exception action reports exception
147 tim 1.1 */
148 jsr166 1.19 public void testSubmitFailedPrivilegedExceptionAction() throws Exception {
149 jsr166 1.23 Runnable r = new CheckedRunnable() {
150     public void realRun() throws Exception {
151     ExecutorService e = new DirectExecutorService();
152     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
153 tim 1.1 public Object run() throws Exception {
154     throw new IndexOutOfBoundsException();
155 dl 1.5 }}));
156 tim 1.1
157 jsr166 1.23 try {
158     future.get();
159     shouldThrow();
160     } catch (ExecutionException success) {
161     assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
162     }}};
163    
164     runWithPermissions(r);
165 tim 1.1 }
166    
167     /**
168 dl 1.12 * execute(null runnable) throws NPE
169 tim 1.1 */
170     public void testExecuteNullRunnable() {
171 jsr166 1.36 ExecutorService e = new DirectExecutorService();
172 tim 1.1 try {
173 jsr166 1.19 e.submit((Runnable) null);
174 tim 1.1 shouldThrow();
175 jsr166 1.19 } catch (NullPointerException success) {}
176 tim 1.1 }
177    
178     /**
179 dl 1.12 * submit(null callable) throws NPE
180 tim 1.1 */
181 dl 1.6 public void testSubmitNullCallable() {
182 jsr166 1.36 ExecutorService e = new DirectExecutorService();
183 tim 1.1 try {
184 jsr166 1.19 e.submit((Callable) null);
185 tim 1.1 shouldThrow();
186 jsr166 1.19 } catch (NullPointerException success) {}
187 tim 1.1 }
188    
189     /**
190 jsr166 1.25 * submit(callable).get() throws InterruptedException if interrupted
191 tim 1.1 */
192 jsr166 1.19 public void testInterruptedSubmit() throws InterruptedException {
193 jsr166 1.25 final CountDownLatch submitted = new CountDownLatch(1);
194     final CountDownLatch quittingTime = new CountDownLatch(1);
195     final Callable<Void> awaiter = new CheckedCallable<Void>() {
196     public Void realCall() throws InterruptedException {
197 jsr166 1.41 assertTrue(quittingTime.await(2*LONG_DELAY_MS, MILLISECONDS));
198 jsr166 1.25 return null;
199     }};
200 jsr166 1.40 final ExecutorService p
201     = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS,
202     new ArrayBlockingQueue<Runnable>(10));
203 jsr166 1.41 try (PoolCleaner cleaner = cleaner(p, quittingTime)) {
204     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
205 jsr166 1.25 public void realRun() throws Exception {
206     Future<Void> future = p.submit(awaiter);
207     submitted.countDown();
208     future.get();
209     }});
210 jsr166 1.41
211     await(submitted);
212 jsr166 1.25 t.interrupt();
213 jsr166 1.41 awaitTermination(t);
214 jsr166 1.25 }
215 tim 1.1 }
216    
217     /**
218 jsr166 1.27 * get of submit(callable) throws ExecutionException if callable
219     * throws exception
220 tim 1.1 */
221 jsr166 1.19 public void testSubmitEE() throws InterruptedException {
222 jsr166 1.40 final ThreadPoolExecutor p =
223 jsr166 1.19 new ThreadPoolExecutor(1, 1,
224     60, TimeUnit.SECONDS,
225     new ArrayBlockingQueue<Runnable>(10));
226 jsr166 1.40 try (PoolCleaner cleaner = cleaner(p)) {
227     Callable c = new Callable() {
228     public Object call() { throw new ArithmeticException(); }};
229     try {
230     p.submit(c).get();
231     shouldThrow();
232     } catch (ExecutionException success) {
233     assertTrue(success.getCause() instanceof ArithmeticException);
234     }
235 tim 1.1 }
236 dl 1.6 }
237    
238     /**
239     * invokeAny(null) throws NPE
240     */
241 jsr166 1.28 public void testInvokeAny1() throws Exception {
242 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
243     try (PoolCleaner cleaner = cleaner(e)) {
244     try {
245     e.invokeAny(null);
246     shouldThrow();
247     } catch (NullPointerException success) {}
248 dl 1.6 }
249     }
250    
251     /**
252     * invokeAny(empty collection) throws IAE
253     */
254 jsr166 1.28 public void testInvokeAny2() throws Exception {
255 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
256     try (PoolCleaner cleaner = cleaner(e)) {
257     try {
258     e.invokeAny(new ArrayList<Callable<String>>());
259     shouldThrow();
260     } catch (IllegalArgumentException success) {}
261 dl 1.6 }
262     }
263    
264     /**
265     * invokeAny(c) throws NPE if c has null elements
266     */
267 jsr166 1.19 public void testInvokeAny3() throws Exception {
268 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
269     try (PoolCleaner cleaner = cleaner(e)) {
270     List<Callable<Long>> l = new ArrayList<Callable<Long>>();
271     l.add(new Callable<Long>() {
272     public Long call() { throw new ArithmeticException(); }});
273     l.add(null);
274     try {
275     e.invokeAny(l);
276     shouldThrow();
277     } catch (NullPointerException success) {}
278 dl 1.6 }
279     }
280    
281     /**
282 dl 1.12 * invokeAny(c) throws ExecutionException if no task in c completes
283 dl 1.6 */
284 jsr166 1.19 public void testInvokeAny4() throws InterruptedException {
285 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
286     try (PoolCleaner cleaner = cleaner(e)) {
287     List<Callable<String>> l = new ArrayList<Callable<String>>();
288     l.add(new NPETask());
289     try {
290     e.invokeAny(l);
291     shouldThrow();
292     } catch (ExecutionException success) {
293     assertTrue(success.getCause() instanceof NullPointerException);
294     }
295 dl 1.6 }
296     }
297    
298     /**
299 dl 1.12 * invokeAny(c) returns result of some task in c if at least one completes
300 dl 1.6 */
301 jsr166 1.19 public void testInvokeAny5() throws Exception {
302 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
303     try (PoolCleaner cleaner = cleaner(e)) {
304 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
305 dl 1.6 l.add(new StringTask());
306     l.add(new StringTask());
307     String result = e.invokeAny(l);
308     assertSame(TEST_STRING, result);
309     }
310     }
311    
312     /**
313     * invokeAll(null) throws NPE
314     */
315 jsr166 1.19 public void testInvokeAll1() throws InterruptedException {
316 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
317     try (PoolCleaner cleaner = cleaner(e)) {
318     try {
319     e.invokeAll(null);
320     shouldThrow();
321     } catch (NullPointerException success) {}
322 dl 1.6 }
323     }
324    
325     /**
326     * invokeAll(empty collection) returns empty collection
327     */
328 jsr166 1.19 public void testInvokeAll2() throws InterruptedException {
329 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
330     try (PoolCleaner cleaner = cleaner(e)) {
331 dl 1.6 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
332     assertTrue(r.isEmpty());
333     }
334     }
335    
336     /**
337     * invokeAll(c) throws NPE if c has null elements
338     */
339 jsr166 1.19 public void testInvokeAll3() throws InterruptedException {
340 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
341     try (PoolCleaner cleaner = cleaner(e)) {
342     List<Callable<String>> l = new ArrayList<Callable<String>>();
343     l.add(new StringTask());
344     l.add(null);
345     try {
346     e.invokeAll(l);
347     shouldThrow();
348     } catch (NullPointerException success) {}
349 dl 1.6 }
350     }
351    
352     /**
353 dl 1.12 * get of returned element of invokeAll(c) throws exception on failed task
354 dl 1.6 */
355 jsr166 1.19 public void testInvokeAll4() throws Exception {
356 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
357     try (PoolCleaner cleaner = cleaner(e)) {
358 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
359 dl 1.6 l.add(new NPETask());
360 jsr166 1.22 List<Future<String>> futures = e.invokeAll(l);
361     assertEquals(1, futures.size());
362     try {
363     futures.get(0).get();
364     shouldThrow();
365     } catch (ExecutionException success) {
366     assertTrue(success.getCause() instanceof NullPointerException);
367 jsr166 1.19 }
368 dl 1.6 }
369     }
370    
371     /**
372 dl 1.12 * invokeAll(c) returns results of all completed tasks in c
373 dl 1.6 */
374 jsr166 1.19 public void testInvokeAll5() throws Exception {
375 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
376     try (PoolCleaner cleaner = cleaner(e)) {
377 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
378 dl 1.6 l.add(new StringTask());
379     l.add(new StringTask());
380 jsr166 1.22 List<Future<String>> futures = e.invokeAll(l);
381     assertEquals(2, futures.size());
382     for (Future<String> future : futures)
383 jsr166 1.19 assertSame(TEST_STRING, future.get());
384 dl 1.8 }
385     }
386    
387     /**
388     * timed invokeAny(null) throws NPE
389     */
390 jsr166 1.19 public void testTimedInvokeAny1() throws Exception {
391 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
392     try (PoolCleaner cleaner = cleaner(e)) {
393     try {
394     e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
395     shouldThrow();
396     } catch (NullPointerException success) {}
397 dl 1.8 }
398     }
399    
400     /**
401 dl 1.12 * timed invokeAny(null time unit) throws NPE
402 dl 1.8 */
403 jsr166 1.19 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
404 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
405     try (PoolCleaner cleaner = cleaner(e)) {
406     List<Callable<String>> l = new ArrayList<Callable<String>>();
407     l.add(new StringTask());
408     try {
409     e.invokeAny(l, MEDIUM_DELAY_MS, null);
410     shouldThrow();
411     } catch (NullPointerException success) {}
412 dl 1.8 }
413     }
414    
415     /**
416     * timed invokeAny(empty collection) throws IAE
417     */
418 jsr166 1.19 public void testTimedInvokeAny2() throws Exception {
419 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
420     try (PoolCleaner cleaner = cleaner(e)) {
421     try {
422     e.invokeAny(new ArrayList<Callable<String>>(),
423     MEDIUM_DELAY_MS, MILLISECONDS);
424     shouldThrow();
425     } catch (IllegalArgumentException success) {}
426 dl 1.8 }
427     }
428    
429     /**
430     * timed invokeAny(c) throws NPE if c has null elements
431     */
432 jsr166 1.19 public void testTimedInvokeAny3() throws Exception {
433 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
434     try (PoolCleaner cleaner = cleaner(e)) {
435     List<Callable<Long>> l = new ArrayList<Callable<Long>>();
436     l.add(new Callable<Long>() {
437     public Long call() { throw new ArithmeticException(); }});
438     l.add(null);
439     try {
440     e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
441     shouldThrow();
442     } catch (NullPointerException success) {}
443 dl 1.8 }
444     }
445    
446     /**
447     * timed invokeAny(c) throws ExecutionException if no task completes
448     */
449 jsr166 1.19 public void testTimedInvokeAny4() throws Exception {
450 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
451     try (PoolCleaner cleaner = cleaner(e)) {
452 jsr166 1.43 long startTime = System.nanoTime();
453 jsr166 1.40 List<Callable<String>> l = new ArrayList<Callable<String>>();
454     l.add(new NPETask());
455     try {
456 jsr166 1.43 e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
457 jsr166 1.40 shouldThrow();
458     } catch (ExecutionException success) {
459     assertTrue(success.getCause() instanceof NullPointerException);
460     }
461 jsr166 1.43 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
462 dl 1.8 }
463     }
464    
465     /**
466 dl 1.12 * timed invokeAny(c) returns result of some task in c
467 dl 1.8 */
468 jsr166 1.19 public void testTimedInvokeAny5() throws Exception {
469 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
470     try (PoolCleaner cleaner = cleaner(e)) {
471 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
472 dl 1.8 l.add(new StringTask());
473     l.add(new StringTask());
474 jsr166 1.20 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
475 dl 1.8 assertSame(TEST_STRING, result);
476     }
477     }
478    
479     /**
480     * timed invokeAll(null) throws NPE
481     */
482 jsr166 1.19 public void testTimedInvokeAll1() throws InterruptedException {
483 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
484     try (PoolCleaner cleaner = cleaner(e)) {
485     try {
486     e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
487     shouldThrow();
488     } catch (NullPointerException success) {}
489 dl 1.8 }
490     }
491    
492     /**
493 dl 1.12 * timed invokeAll(null time unit) throws NPE
494 dl 1.8 */
495 jsr166 1.19 public void testTimedInvokeAllNullTimeUnit() throws InterruptedException {
496 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
497     try (PoolCleaner cleaner = cleaner(e)) {
498     List<Callable<String>> l = new ArrayList<Callable<String>>();
499     l.add(new StringTask());
500     try {
501     e.invokeAll(l, MEDIUM_DELAY_MS, null);
502     shouldThrow();
503     } catch (NullPointerException success) {}
504 dl 1.8 }
505     }
506    
507     /**
508     * timed invokeAll(empty collection) returns empty collection
509     */
510 jsr166 1.19 public void testTimedInvokeAll2() throws InterruptedException {
511 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
512     try (PoolCleaner cleaner = cleaner(e)) {
513 jsr166 1.20 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
514 dl 1.8 assertTrue(r.isEmpty());
515     }
516     }
517    
518     /**
519     * timed invokeAll(c) throws NPE if c has null elements
520     */
521 jsr166 1.19 public void testTimedInvokeAll3() throws InterruptedException {
522 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
523     try (PoolCleaner cleaner = cleaner(e)) {
524     List<Callable<String>> l = new ArrayList<Callable<String>>();
525     l.add(new StringTask());
526     l.add(null);
527     try {
528     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
529     shouldThrow();
530     } catch (NullPointerException success) {}
531 dl 1.8 }
532     }
533    
534     /**
535 dl 1.12 * get of returned element of invokeAll(c) throws exception on failed task
536 dl 1.8 */
537 jsr166 1.19 public void testTimedInvokeAll4() throws Exception {
538 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
539     try (PoolCleaner cleaner = cleaner(e)) {
540 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
541 dl 1.8 l.add(new NPETask());
542 jsr166 1.22 List<Future<String>> futures =
543 jsr166 1.42 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
544 jsr166 1.22 assertEquals(1, futures.size());
545     try {
546     futures.get(0).get();
547     shouldThrow();
548     } catch (ExecutionException success) {
549     assertTrue(success.getCause() instanceof NullPointerException);
550 jsr166 1.19 }
551 dl 1.8 }
552     }
553    
554     /**
555 dl 1.12 * timed invokeAll(c) returns results of all completed tasks in c
556 dl 1.8 */
557 jsr166 1.19 public void testTimedInvokeAll5() throws Exception {
558 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
559     try (PoolCleaner cleaner = cleaner(e)) {
560 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
561 dl 1.8 l.add(new StringTask());
562     l.add(new StringTask());
563 jsr166 1.22 List<Future<String>> futures =
564 jsr166 1.38 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
565 jsr166 1.22 assertEquals(2, futures.size());
566     for (Future<String> future : futures)
567 jsr166 1.19 assertSame(TEST_STRING, future.get());
568 dl 1.8 }
569     }
570    
571     /**
572 dl 1.12 * timed invokeAll cancels tasks not completed by timeout
573 dl 1.8 */
574 jsr166 1.38 public void testTimedInvokeAll6() throws Exception {
575 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
576     try (PoolCleaner cleaner = cleaner(e)) {
577 jsr166 1.39 for (long timeout = timeoutMillis();;) {
578     List<Callable<String>> tasks = new ArrayList<>();
579     tasks.add(new StringTask("0"));
580     tasks.add(Executors.callable(possiblyInterruptedRunnable(timeout),
581     TEST_STRING));
582     tasks.add(new StringTask("2"));
583     long startTime = System.nanoTime();
584     List<Future<String>> futures =
585     e.invokeAll(tasks, timeout, MILLISECONDS);
586     assertEquals(tasks.size(), futures.size());
587     assertTrue(millisElapsedSince(startTime) >= timeout);
588     for (Future future : futures)
589     assertTrue(future.isDone());
590     try {
591     assertEquals("0", futures.get(0).get());
592     assertEquals(TEST_STRING, futures.get(1).get());
593     } catch (CancellationException retryWithLongerTimeout) {
594     // unusual delay before starting second task
595     timeout *= 2;
596     if (timeout >= LONG_DELAY_MS / 2)
597     fail("expected exactly one task to be cancelled");
598     continue;
599     }
600     assertTrue(futures.get(2).isCancelled());
601     break;
602     }
603 dl 1.6 }
604 tim 1.1 }
605    
606 dl 1.3 }