6880336: SwingWorker deadlocks due one thread in the swingworker-pool
Reviewed-by: dcherepanov, alexp
--- a/jdk/src/share/classes/javax/swing/SwingWorker.java Thu Apr 15 15:19:02 2010 -0700
+++ b/jdk/src/share/classes/javax/swing/SwingWorker.java Tue Apr 27 18:08:26 2010 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,9 +42,10 @@
import sun.swing.AccumulativeRunnable;
/**
- * An abstract class to perform lengthy GUI-interacting tasks in a
- * dedicated thread.
- *
+ * An abstract class to perform lengthy GUI-interaction tasks in a
+ * background thread. Several background threads can be used to execute such
+ * tasks. However, the exact strategy of choosing a thread for any particular
+ * {@code SwingWorker} is unspecified and should not be relied on.
* <p>
* When writing a multi-threaded application using Swing, there are
* two constraints to keep in mind:
@@ -772,7 +773,7 @@
};
executorService =
- new ThreadPoolExecutor(1, MAX_WORKER_THREADS,
+ new ThreadPoolExecutor(MAX_WORKER_THREADS, MAX_WORKER_THREADS,
10L, TimeUnit.MINUTES,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/SwingWorker/6880336/NestedWorkers.java Tue Apr 27 18:08:26 2010 +0400
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6880336
+ * @summary Test for nested SwingWorkers, i.e. when the second worker is
+started from the first's doInBackground() method. A timeout when running
+* this test is an indication of failure.
+ * @author Artem Ananiev
+ * @run main/timeout=32 NestedWorkers
+ */
+
+import javax.swing.*;
+
+public class NestedWorkers extends SwingWorker<String, Void> {
+
+ private final static int MAX_LEVEL = 2;
+
+ private int level;
+
+ public NestedWorkers(int level) {
+ super();
+ this.level = level;
+ }
+
+ @Override
+ public String doInBackground() throws Exception {
+ if (level < MAX_LEVEL) {
+ SwingWorker<String, Void> nested = new NestedWorkers(level + 1);
+ nested.execute();
+ nested.get();
+ }
+ System.out.println("doInBackground " + level + " is complete");
+ return String.valueOf(level);
+ }
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ SwingWorker<String, Void> sw = new NestedWorkers(0);
+ sw.execute();
+ try {
+ System.err.println(sw.get());
+ } catch (Exception z) {
+ throw new RuntimeException(z);
+ }
+ }
+ });
+ }
+
+}