Print this page
Split |
Close |
Expand all |
Collapse all |
--- old/test/java/util/concurrent/ThreadPoolExecutor/ShutdownNowExecuteRace.java
+++ new/test/java/util/concurrent/ThreadPoolExecutor/ShutdownNowExecuteRace.java
1 1 /*
2 2 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 4 *
5 5 * This code is free software; you can redistribute it and/or modify it
6 6 * under the terms of the GNU General Public License version 2 only, as
7 7 * published by the Free Software Foundation.
8 8 *
9 9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 12 * version 2 for more details (a copy is included in the LICENSE file that
13 13 * accompanied this code).
14 14 *
15 15 * You should have received a copy of the GNU General Public License version
16 16 * 2 along with this work; if not, write to the Free Software Foundation,
17 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 18 *
19 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 20 * or visit www.oracle.com if you need additional information or have any
21 21 * questions.
22 22 */
23 23
24 24 /*
25 25 * @test
26 26 * @bug 6523756
27 27 * @summary Race task submission against shutdownNow
28 28 * @author Martin Buchholz
29 29 */
30 30
31 31 // For extra chances to detect shutdownNow vs. execute races,
32 32 // crank up the iterations to, say 1<<22 and
↓ open down ↓ |
32 lines elided |
↑ open up ↑ |
33 33 // add a call to Thread.yield() before the call to t.start()
34 34 // in ThreadPoolExecutor.addWorker.
35 35
36 36 import java.util.*;
37 37 import java.util.concurrent.*;
38 38
39 39 public class ShutdownNowExecuteRace {
40 40 static volatile boolean quit = false;
41 41 static volatile ThreadPoolExecutor pool = null;
42 42
43 - final static Runnable sleeper = new Runnable() { public void run() {
43 + static final Runnable sleeper = new Runnable() { public void run() {
44 44 final long ONE_HOUR = 1000L * 60L * 60L;
45 45 try { Thread.sleep(ONE_HOUR); }
46 46 catch (InterruptedException ie) {}
47 47 catch (Throwable t) { unexpected(t); }}};
48 48
49 49 static void realMain(String[] args) throws Throwable {
50 50 final int iterations = 1 << 8;
51 51 Thread thread = new Thread() { public void run() {
52 52 while (! quit) {
53 53 ThreadPoolExecutor pool = ShutdownNowExecuteRace.pool;
54 54 if (pool != null)
55 55 try { pool.execute(sleeper); }
56 56 catch (RejectedExecutionException e) {/* OK */}
57 57 catch (Throwable t) { unexpected(t); }}}};
58 58 thread.start();
59 59 for (int i = 0; i < iterations; i++) {
60 60 pool = new ThreadPoolExecutor(
61 61 10, 10, 3L, TimeUnit.DAYS,
62 62 new ArrayBlockingQueue<Runnable>(10));
63 63 pool.shutdownNow();
64 64 check(pool.awaitTermination(3L, TimeUnit.MINUTES));
65 65 }
66 66 quit = true;
67 67 thread.join();
68 68 }
69 69
70 70 //--------------------- Infrastructure ---------------------------
71 71 static volatile int passed = 0, failed = 0;
72 72 static void pass() {passed++;}
73 73 static void fail() {failed++; Thread.dumpStack();}
↓ open down ↓ |
20 lines elided |
↑ open up ↑ |
74 74 static void fail(String msg) {System.out.println(msg); fail();}
75 75 static void unexpected(Throwable t) {failed++; t.printStackTrace();}
76 76 static void check(boolean cond) {if (cond) pass(); else fail();}
77 77 static void equal(Object x, Object y) {
78 78 if (x == null ? y == null : x.equals(y)) pass();
79 79 else fail(x + " not equal to " + y);}
80 80 public static void main(String[] args) throws Throwable {
81 81 try {realMain(args);} catch (Throwable t) {unexpected(t);}
82 82 System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
83 83 if (failed > 0) throw new AssertionError("Some tests failed");}
84 - private static abstract class Fun {abstract void f() throws Throwable;}
84 + private abstract static class Fun {abstract void f() throws Throwable;}
85 85 static void THROWS(Class<? extends Throwable> k, Fun... fs) {
86 86 for (Fun f : fs)
87 87 try { f.f(); fail("Expected " + k.getName() + " not thrown"); }
88 88 catch (Throwable t) {
89 89 if (k.isAssignableFrom(t.getClass())) pass();
90 90 else unexpected(t);}}
91 - private static abstract class CheckedThread extends Thread {
91 + private abstract static class CheckedThread extends Thread {
92 92 abstract void realRun() throws Throwable;
93 93 public void run() {
94 94 try {realRun();} catch (Throwable t) {unexpected(t);}}}
95 95 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX