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

Comparing jsr166/src/test/tck/ExecutorsTest.java (file contents):
Revision 1.2 by dl, Sun Sep 7 20:39:11 2003 UTC vs.
Revision 1.6 by dl, Fri Sep 26 15:33:13 2003 UTC

# Line 11 | Line 11 | import java.util.*;
11   import java.util.concurrent.*;
12   import java.math.BigInteger;
13  
14 < public class ExecutorsTest extends TestCase{
15 <    
14 > public class ExecutorsTest extends JSR166TestCase{
15      public static void main(String[] args) {
16          junit.textui.TestRunner.run (suite());  
17      }
19    
20
18      public static Test suite() {
19          return new TestSuite(ExecutorsTest.class);
20      }
21  
22 <    private static long SHORT_DELAY_MS = 100;
23 <    private static long MEDIUM_DELAY_MS = 1000;
24 <    private static long LONG_DELAY_MS = 10000;
25 <
26 <    class SleepRun implements Runnable {
27 <        public void run() {
28 <            try{
29 <                Thread.sleep(MEDIUM_DELAY_MS);
30 <            } catch(InterruptedException e){
31 <                fail("unexpected exception");
22 >    private static final String TEST_STRING = "a test string";
23 >
24 >    private static class StringTask implements Callable<String> {
25 >        public String call() { return TEST_STRING; }
26 >    }
27 >
28 >    static class DirectExecutor implements Executor {
29 >        public void execute(Runnable r) {
30 >            r.run();
31 >        }
32 >    }
33 >
34 >    static class TimedCallable<T> implements Callable<T> {
35 >        private final Executor exec;
36 >        private final Callable<T> func;
37 >        private final long msecs;
38 >        
39 >        TimedCallable(Executor exec, Callable<T> func, long msecs) {
40 >            this.exec = exec;
41 >            this.func = func;
42 >            this.msecs = msecs;
43 >        }
44 >        
45 >        public T call() throws Exception {
46 >            Future<T> ftask = Executors.execute(exec, func);
47 >            try {
48 >                return ftask.get(msecs, TimeUnit.MILLISECONDS);
49 >            } finally {
50 >                ftask.cancel(true);
51              }
52          }
53      }
38    
54  
55 <    class SleepCall implements Callable {
56 <        public Object call(){
57 <            try{
58 <                Thread.sleep(MEDIUM_DELAY_MS);
59 <            }catch(InterruptedException e){
60 <                fail("unexpected exception");
55 >
56 >    private static class Fib implements Callable<BigInteger> {
57 >        private final BigInteger n;
58 >        Fib(long n) {
59 >            if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
60 >            this.n = BigInteger.valueOf(n);
61 >        }
62 >        public BigInteger call() {
63 >            BigInteger f1 = BigInteger.ONE;
64 >            BigInteger f2 = f1;
65 >            for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
66 >                BigInteger t = f1.add(f2);
67 >                f1 = f2;
68 >                f2 = t;
69              }
70 <            return Boolean.TRUE;
70 >            return f1;
71 >        }
72 >    };
73 >
74 >    /**
75 >     * A newCachedThreadPool can execute runnables
76 >     */
77 >    public void testNewCachedThreadPool1() {
78 >        ExecutorService e = Executors.newCachedThreadPool();
79 >        e.execute(new NoOpRunnable());
80 >        e.execute(new NoOpRunnable());
81 >        e.execute(new NoOpRunnable());
82 >        e.shutdown();
83 >    }
84 >
85 >    /**
86 >     * A newCachedThreadPool with given ThreadFactory can execute runnables
87 >     */
88 >    public void testNewCachedThreadPool2() {
89 >        ExecutorService e = Executors.newCachedThreadPool(new SimpleThreadFactory());
90 >        e.execute(new NoOpRunnable());
91 >        e.execute(new NoOpRunnable());
92 >        e.execute(new NoOpRunnable());
93 >        e.shutdown();
94 >    }
95 >
96 >    /**
97 >     * A newCachedThreadPool with null ThreadFactory throws NPE
98 >     */
99 >    public void testNewCachedThreadPool3() {
100 >        try {
101 >            ExecutorService e = Executors.newCachedThreadPool(null);
102 >            shouldThrow();
103 >        }
104 >        catch(NullPointerException success) {
105 >        }
106 >    }
107 >
108 >
109 >    /**
110 >     * A new SingleThreadExecutor can execute runnables
111 >     */
112 >    public void testNewSingleThreadExecutor1() {
113 >        ExecutorService e = Executors.newSingleThreadExecutor();
114 >        e.execute(new NoOpRunnable());
115 >        e.execute(new NoOpRunnable());
116 >        e.execute(new NoOpRunnable());
117 >        e.shutdown();
118 >    }
119 >
120 >    /**
121 >     * A new SingleThreadExecutor with given ThreadFactory can execute runnables
122 >     */
123 >    public void testNewSingleThreadExecutor2() {
124 >        ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory());
125 >        e.execute(new NoOpRunnable());
126 >        e.execute(new NoOpRunnable());
127 >        e.execute(new NoOpRunnable());
128 >        e.shutdown();
129 >    }
130 >
131 >    /**
132 >     * A new SingleThreadExecutor with null ThreadFactory throws NPE
133 >     */
134 >    public void testNewSingleThreadExecutor3() {
135 >        try {
136 >            ExecutorService e = Executors.newSingleThreadExecutor(null);
137 >            shouldThrow();
138 >        }
139 >        catch(NullPointerException success) {
140 >        }
141 >    }
142 >
143 >    /**
144 >     * A new newFixedThreadPool can execute runnables
145 >     */
146 >    public void testNewFixedThreadPool1() {
147 >        ExecutorService e = Executors.newFixedThreadPool(2);
148 >        e.execute(new NoOpRunnable());
149 >        e.execute(new NoOpRunnable());
150 >        e.execute(new NoOpRunnable());
151 >        e.shutdown();
152 >    }
153 >
154 >    /**
155 >     * A new newFixedThreadPool with given ThreadFactory can execute runnables
156 >     */
157 >    public void testNewFixedThreadPool2() {
158 >        ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory());
159 >        e.execute(new NoOpRunnable());
160 >        e.execute(new NoOpRunnable());
161 >        e.execute(new NoOpRunnable());
162 >        e.shutdown();
163 >    }
164 >
165 >    /**
166 >     * A new newFixedThreadPool with null ThreadFactory throws NPE
167 >     */
168 >    public void testNewFixedThreadPool3() {
169 >        try {
170 >            ExecutorService e = Executors.newFixedThreadPool(2, null);
171 >            shouldThrow();
172 >        }
173 >        catch(NullPointerException success) {
174 >        }
175 >    }
176 >
177 >    /**
178 >     * A new newFixedThreadPool with 0 threads throws IAE
179 >     */
180 >    public void testNewFixedThreadPool4() {
181 >        try {
182 >            ExecutorService e = Executors.newFixedThreadPool(0);
183 >            shouldThrow();
184 >        }
185 >        catch(IllegalArgumentException success) {
186 >        }
187 >    }
188 >
189 >    /**
190 >     * execute of runnable runs it to completion
191 >     */
192 >    public void testExecuteRunnable () {
193 >        try {
194 >            Executor e = new DirectExecutor();
195 >            TrackedRunnable task = new TrackedRunnable();
196 >            assertFalse(task.done);
197 >            Future<String> future = Executors.execute(e, task, TEST_STRING);
198 >            String result = future.get();
199 >            assertTrue(task.done);
200 >            assertSame(TEST_STRING, result);
201 >        }
202 >        catch (ExecutionException ex) {
203 >            unexpectedException();
204 >        }
205 >        catch (InterruptedException ex) {
206 >            unexpectedException();
207 >        }
208 >    }
209 >
210 >    /**
211 >     * invoke of a runnable runs it to completion
212 >     */
213 >    public void testInvokeRunnable () {
214 >        try {
215 >            Executor e = new DirectExecutor();
216 >            TrackedRunnable task = new TrackedRunnable();
217 >            assertFalse(task.done);
218 >            Executors.invoke(e, task);
219 >            assertTrue(task.done);
220 >        }
221 >        catch (ExecutionException ex) {
222 >            unexpectedException();
223 >        }
224 >        catch (InterruptedException ex) {
225 >            unexpectedException();
226 >        }
227 >    }
228 >
229 >    /**
230 >     * execute of a callable runs it to completion
231 >     */
232 >    public void testExecuteCallable () {
233 >        try {
234 >            Executor e = new DirectExecutor();
235 >            Future<String> future = Executors.execute(e, new StringTask());
236 >            String result = future.get();
237 >            assertSame(TEST_STRING, result);
238 >        }
239 >        catch (ExecutionException ex) {
240 >            unexpectedException();
241 >        }
242 >        catch (InterruptedException ex) {
243 >            unexpectedException();
244 >        }
245 >    }
246 >
247 >    /**
248 >     * invoke of a collable runs it to completion
249 >     */
250 >    public void testInvokeCallable () {
251 >        try {
252 >            Executor e = new DirectExecutor();
253 >            String result = Executors.invoke(e, new StringTask());
254 >
255 >            assertSame(TEST_STRING, result);
256 >        }
257 >        catch (ExecutionException ex) {
258 >            unexpectedException();
259 >        }
260 >        catch (InterruptedException ex) {
261 >            unexpectedException();
262 >        }
263 >    }
264 >
265 >    /**
266 >     * execute with null executor throws NPE
267 >     */
268 >    public void testNullExecuteRunnable () {
269 >        try {
270 >            TrackedRunnable task = new TrackedRunnable();
271 >            assertFalse(task.done);
272 >            Future<String> future = Executors.execute(null, task, TEST_STRING);
273 >            shouldThrow();
274 >        }
275 >        catch (NullPointerException success) {
276 >        }
277 >        catch (Exception ex) {
278 >            unexpectedException();
279 >        }
280 >    }
281 >
282 >    /**
283 >     * execute with a null runnable throws NPE
284 >     */
285 >    public void testExecuteNullRunnable() {
286 >        try {
287 >            Executor e = new DirectExecutor();
288 >            TrackedRunnable task = null;
289 >            Future<String> future = Executors.execute(e, task, TEST_STRING);
290 >            shouldThrow();
291 >        }
292 >        catch (NullPointerException success) {
293 >        }
294 >        catch (Exception ex) {
295 >            unexpectedException();
296          }
297      }
298  
299 +    /**
300 +     * invoke of a null runnable throws NPE
301 +     */
302 +    public void testInvokeNullRunnable () {
303 +        try {
304 +            Executor e = new DirectExecutor();
305 +            TrackedRunnable task = null;
306 +            Executors.invoke(e, task);
307 +            shouldThrow();
308 +        }
309 +        catch (NullPointerException success) {
310 +        }
311 +        catch (Exception ex) {
312 +            unexpectedException();
313 +        }
314 +    }
315  
316 +    /**
317 +     * execute of a null callable throws NPE
318 +     */
319 +    public void testExecuteNullCallable () {
320 +        try {
321 +            Executor e = new DirectExecutor();
322 +            StringTask t = null;
323 +            Future<String> future = Executors.execute(e, t);
324 +            shouldThrow();
325 +        }
326 +        catch (NullPointerException success) {
327 +        }
328 +        catch (Exception ex) {
329 +            unexpectedException();
330 +        }
331 +    }
332  
333      /**
334 <     *  Test to verify execute(Executor, Runnable) will throw
55 <     *  RejectedExecutionException Attempting to execute a runnable on
56 <     *  a full ThreadPool will cause such an exception here, up to 5
57 <     *  runnables are attempted on a pool capable on handling one
58 <     *  until it throws an exception
334 >     * invoke of a null callable throws NPE
335       */
336 <    public void testExecute1(){
337 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
338 <        try{
336 >    public void testInvokeNullCallable () {
337 >        try {
338 >            Executor e = new DirectExecutor();
339 >            StringTask t = null;
340 >            String result = Executors.invoke(e, t);
341 >            shouldThrow();
342 >        }
343 >        catch (NullPointerException success) {
344 >        }
345 >        catch (Exception ex) {
346 >            unexpectedException();
347 >        }
348 >    }
349 >
350 >    /**
351 >     *  execute(Executor, Runnable) throws RejectedExecutionException
352 >     *  if saturated.
353 >     */
354 >    public void testExecute1() {
355 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
356 >        try {
357              
358              for(int i = 0; i < 5; ++i){
359 <                Executors.execute(p, new SleepRun(), Boolean.TRUE);
359 >                Executors.execute(p, new MediumRunnable(), Boolean.TRUE);
360              }
361 <            fail("should throw");
361 >            shouldThrow();
362          } catch(RejectedExecutionException success){}
363 <        p.shutdownNow();
363 >        joinPool(p);
364      }
365  
366      /**
367 <     *  Test to verify execute(Executor, Callable) will throw
368 <     *  RejectedExecutionException Attempting to execute a callable on
75 <     *  a full ThreadPool will cause such an exception here, up to 5
76 <     *  runnables are attempted on a pool capable on handling one
77 <     *  until it throws an exception
367 >     *  execute(Executor, Callable)throws RejectedExecutionException
368 >     *  if saturated.
369       */
370 <    public void testExecute2(){
371 <         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
372 <        try{
370 >    public void testExecute2() {
371 >         ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
372 >        try {
373              for(int i = 0; i < 5; ++i) {
374 <                Executors.execute(p, new SleepCall());
374 >                Executors.execute(p, new SmallCallable());
375              }
376 <            fail("should throw");
377 <        }catch(RejectedExecutionException e){}
378 <        p.shutdownNow();
376 >            shouldThrow();
377 >        } catch(RejectedExecutionException e){}
378 >        joinPool(p);
379      }
380  
381  
382      /**
383 <     *  Test to verify invoke(Executor, Runnable) throws InterruptedException
384 <     *  A single use of invoke starts that will wait long enough
94 <     *  for the invoking thread to be interrupted
383 >     *  invoke(Executor, Runnable) throws InterruptedException if
384 >     *  caller interrupted.
385       */
386 <    public void testInvoke2(){
387 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
386 >    public void testInterruptedInvoke() {
387 >        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
388          Thread t = new Thread(new Runnable() {
389 <                public void run(){
390 <                    try{
391 <                        Executors.invoke(p,new Runnable(){
392 <                                public void run(){
393 <                                    try{
389 >                public void run() {
390 >                    try {
391 >                        Executors.invoke(p,new Runnable() {
392 >                                public void run() {
393 >                                    try {
394                                          Thread.sleep(MEDIUM_DELAY_MS);
395 <                                        fail("should throw");
396 <                                    }catch(InterruptedException e){
395 >                                        shouldThrow();
396 >                                    } catch(InterruptedException e){
397                                      }
398                                  }
399                              });
400                      } catch(InterruptedException success){
401                      } catch(Exception e) {
402 <                        fail("unexpected exception");
402 >                        unexpectedException();
403                      }
404                      
405                  }
406              });
407 <        try{
407 >        try {
408              t.start();
409              Thread.sleep(SHORT_DELAY_MS);
410              t.interrupt();
411 <        }catch(Exception e){
412 <            fail("unexpected exception");
411 >        } catch(Exception e){
412 >            unexpectedException();
413          }
414 <        p.shutdownNow();
414 >        joinPool(p);
415      }
416  
417      /**
418 <     *  Test to verify invoke(Executor, Runnable) will throw
419 <     *  ExecutionException An ExecutionException occurs when the
130 <     *  underlying Runnable throws an exception, here the
131 <     *  DivideByZeroException will cause an ExecutionException
418 >     *  invoke(Executor, Runnable) throws ExecutionException if
419 >     *  runnable throws exception.
420       */
421 <    public void testInvoke3(){
422 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
423 <        try{
424 <            Runnable r = new Runnable(){
425 <                    public void run(){
421 >    public void testInvoke3() {
422 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
423 >        try {
424 >            Runnable r = new Runnable() {
425 >                    public void run() {
426                          int i = 5/0;
427                      }
428                  };
# Line 143 | Line 431 | public class ExecutorsTest extends TestC
431                  Executors.invoke(p,r);
432              }
433              
434 <            fail("should throw");
434 >            shouldThrow();
435          } catch(ExecutionException success){
436          } catch(Exception e){
437 <            fail("should throw EE");
437 >            unexpectedException();
438          }
439 <        p.shutdownNow();
439 >        joinPool(p);
440      }
441  
442  
443  
444      /**
445 <     *  Test to verify invoke(Executor, Callable) throws
446 <     *  InterruptedException A single use of invoke starts that will
159 <     *  wait long enough for the invoking thread to be interrupted
445 >     *  invoke(Executor, Callable) throws InterruptedException if
446 >     *  callable throws exception
447       */
448 <    public void testInvoke5(){
449 <        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
448 >    public void testInvoke5() {
449 >        final ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
450          
451 <        final Callable c = new Callable(){
452 <                public Object call(){
453 <                    try{
454 <                        Executors.invoke(p, new SleepCall());
455 <                        fail("should throw");
456 <                    }catch(InterruptedException e){}
451 >        final Callable c = new Callable() {
452 >                public Object call() {
453 >                    try {
454 >                        Executors.invoke(p, new SmallCallable());
455 >                        shouldThrow();
456 >                    } catch(InterruptedException e){}
457                      catch(RejectedExecutionException e2){}
458                      catch(ExecutionException e3){}
459                      return Boolean.TRUE;
# Line 175 | Line 462 | public class ExecutorsTest extends TestC
462  
463  
464          
465 <        Thread t = new Thread(new Runnable(){
466 <                public void run(){
467 <                    try{
465 >        Thread t = new Thread(new Runnable() {
466 >                public void run() {
467 >                    try {
468                          c.call();
469 <                    }catch(Exception e){}
469 >                    } catch(Exception e){}
470                  }
471            });
472 <        try{
472 >        try {
473              t.start();
474              Thread.sleep(SHORT_DELAY_MS);
475              t.interrupt();
476              t.join();
477 <        }catch(InterruptedException e){
478 <            fail("unexpected exception");
477 >        } catch(InterruptedException e){
478 >            unexpectedException();
479          }
480          
481 <        p.shutdownNow();
481 >        joinPool(p);
482      }
483  
484      /**
485 <     *  Test to verify invoke(Executor, Callable) will throw ExecutionException
486 <     *  An ExecutionException occurs when the underlying Runnable throws
200 <     *  an exception, here the DivideByZeroException will cause an ExecutionException
485 >     *  invoke(Executor, Callable) will throw ExecutionException
486 >     *  if callable throws exception
487       */
488 <    public void testInvoke6(){
489 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
488 >    public void testInvoke6() {
489 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
490  
491 <        try{
492 <            Callable c = new Callable(){
493 <                    public Object call(){
491 >        try {
492 >            Callable c = new Callable() {
493 >                    public Object call() {
494                          int i = 5/0;
495                          return Boolean.TRUE;
496                      }
# Line 214 | Line 500 | public class ExecutorsTest extends TestC
500                  Executors.invoke(p,c);
501              }
502              
503 <            fail("should throw");
504 <        }catch(RejectedExecutionException e){}
505 <        catch(InterruptedException e2){}
506 <        catch(ExecutionException e3){}
507 <        p.shutdownNow();
222 <    }
223 <
224 <    public void testExecuteRunnable () {
225 <        try {
226 <            Executor e = new DirectExecutor();
227 <            Task task = new Task();
228 <
229 <            assertFalse("task should not be complete", task.isCompleted());
230 <
231 <            Future<String> future = Executors.execute(e, task, TEST_STRING);
232 <            String result = future.get();
233 <
234 <            assertTrue("task should be complete", task.isCompleted());
235 <            assertSame("should return test string", TEST_STRING, result);
236 <        }
237 <        catch (ExecutionException ex) {
238 <            fail("Unexpected exception");
239 <        }
240 <        catch (InterruptedException ex) {
241 <            fail("Unexpected exception");
503 >            shouldThrow();
504 >        }
505 >        catch(ExecutionException success){
506 >        } catch(Exception e) {
507 >            unexpectedException();
508          }
509 +        joinPool(p);
510      }
511  
245    public void testInvokeRunnable () {
246        try {
247            Executor e = new DirectExecutor();
248            Task task = new Task();
512  
250            assertFalse("task should not be complete", task.isCompleted());
251
252            Executors.invoke(e, task);
253
254            assertTrue("task should be complete", task.isCompleted());
255        }
256        catch (ExecutionException ex) {
257            fail("Unexpected exception");
258        }
259        catch (InterruptedException ex) {
260            fail("Unexpected exception");
261        }
262    }
263
264    public void testExecuteCallable () {
265        try {
266            Executor e = new DirectExecutor();
267            Future<String> future = Executors.execute(e, new StringTask());
268            String result = future.get();
269
270            assertSame("should return test string", TEST_STRING, result);
271        }
272        catch (ExecutionException ex) {
273            fail("Unexpected exception");
274        }
275        catch (InterruptedException ex) {
276            fail("Unexpected exception");
277        }
278    }
279
280    public void testInvokeCallable () {
281        try {
282            Executor e = new DirectExecutor();
283            String result = Executors.invoke(e, new StringTask());
284
285            assertSame("should return test string", TEST_STRING, result);
286        }
287        catch (ExecutionException ex) {
288            fail("Unexpected exception" );
289        }
290        catch (InterruptedException ex) {
291            fail("Unexpected exception");
292        }
293    }
294
295    private static final String TEST_STRING = "a test string";
296
297    private static class Task implements Runnable {
298        public void run() { completed = true; }
299        public boolean isCompleted() { return completed; }
300        public void reset() { completed = false; }
301        private boolean completed = false;
302    }
303
304    private static class StringTask implements Callable<String> {
305        public String call() { return TEST_STRING; }
306    }
307
308    static class DirectExecutor implements Executor {
309        public void execute(Runnable r) {
310            r.run();
311        }
312    }
513  
514      /**
515 <     * Check that timeouts from execute will time out if they compute
316 <     * too long.
515 >     *  timeouts from execute will time out if they compute too long.
516       */
318
517      public void testTimedCallable() {
518          int N = 10000;
519          ExecutorService executor = Executors.newSingleThreadExecutor();
# Line 341 | Line 539 | public class ExecutorsTest extends TestC
539                      return;
540                  }
541                  catch (Exception e) {
542 <                    fail("unexpected exception: " + e);
542 >                    unexpectedException();
543                  }
544              }
545              // if by chance we didn't ever time out, total time must be small
# Line 349 | Line 547 | public class ExecutorsTest extends TestC
547              assertTrue(elapsed < N);
548          }
549          finally {
550 <            executor.shutdownNow();
550 >            joinPool(executor);
551          }
552      }
553  
554      
357    static class TimedCallable<T> implements Callable<T> {
358        private final Executor exec;
359        private final Callable<T> func;
360        private final long msecs;
361        
362        TimedCallable(Executor exec, Callable<T> func, long msecs) {
363            this.exec = exec;
364            this.func = func;
365            this.msecs = msecs;
366        }
367        
368        public T call() throws Exception {
369            Future<T> ftask = Executors.execute(exec, func);
370            try {
371                return ftask.get(msecs, TimeUnit.MILLISECONDS);
372            } finally {
373                ftask.cancel(true);
374            }
375        }
376    }
377
378
379    private static class Fib implements Callable<BigInteger> {
380        private final BigInteger n;
381        Fib(long n) {
382            if (n < 0) throw new IllegalArgumentException("need non-negative arg, but got " + n);
383            this.n = BigInteger.valueOf(n);
384        }
385        public BigInteger call() {
386            BigInteger f1 = BigInteger.ONE;
387            BigInteger f2 = f1;
388            for (BigInteger i = BigInteger.ZERO; i.compareTo(n) < 0; i = i.add(BigInteger.ONE)) {
389                BigInteger t = f1.add(f2);
390                f1 = f2;
391                f2 = t;
392            }
393            return f1;
394        }
395    };
396
555  
556  
557   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines