From 01b87ba8e2c48ad29c1f4771973ebbe938967448 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 16 Aug 2022 22:53:36 +0000 Subject: [PATCH] 8289616: Drop use of Thread.stop in AppContext Reviewed-by: alanb, iris, azvegint --- .../share/classes/sun/awt/AppContext.java | 41 ++-------- .../ApplicationThreadsStop.java | 77 ------------------- 2 files changed, 7 insertions(+), 111 deletions(-) delete mode 100644 test/jdk/java/awt/AppContext/ApplicationThreadsStop/ApplicationThreadsStop.java diff --git a/src/java.desktop/share/classes/sun/awt/AppContext.java b/src/java.desktop/share/classes/sun/awt/AppContext.java index 7cf359f54a1..d8c64c83426 100644 --- a/src/java.desktop/share/classes/sun/awt/AppContext.java +++ b/src/java.desktop/share/classes/sun/awt/AppContext.java @@ -397,6 +397,13 @@ public final class AppContext { */ @SuppressWarnings({"deprecation", "removal"}) public void dispose() throws IllegalThreadStateException { + System.err.println( + """ + WARNING: sun.awt.AppContext.dispose() no longer stops threads. + Additionally AppContext will be removed in a future release. + Remove all uses of this internal class as soon as possible. + There is no replacement. + """); // Check to be sure that the current Thread isn't in this AppContext if (this.threadGroup.parentOf(Thread.currentThread().getThreadGroup())) { throw new IllegalThreadStateException( @@ -502,33 +509,6 @@ public final class AppContext { } catch (InterruptedException e) { } } - // Then, we stop any remaining Threads - AccessController.doPrivileged((PrivilegedAction) () -> { - Thread[] threads; - int len, threadCount; - do { - len = threadGroup.activeCount() + 4; - threads = new Thread[len]; - threadCount = threadGroup.enumerate(threads); - } while (threadCount == len); - for (int i = 0; i < threadCount; i++) { - threads[i].stop(); - } - return null; - }); - - // Next, we sleep 10ms at a time, waiting for all of the active - // Threads in the ThreadGroup to die. - - startTime = System.currentTimeMillis(); - endTime = startTime + THREAD_INTERRUPT_TIMEOUT; - while ((this.threadGroup.activeCount() > 0) && - (System.currentTimeMillis() < endTime)) { - try { - Thread.sleep(10); - } catch (InterruptedException e) { } - } - // Next, we remove this and all subThreadGroups from threadGroup2appContext int numSubGroups = this.threadGroup.activeGroupCount(); if (numSubGroups > 0) { @@ -542,13 +522,6 @@ public final class AppContext { threadAppContext.set(null); - // Finally, we destroy the ThreadGroup entirely. - try { - this.threadGroup.destroy(); - } catch (IllegalThreadStateException e) { - // Fired if not all the Threads died, ignore it and proceed - } - synchronized (table) { this.table.clear(); // Clear out the Hashtable to ease garbage collection } diff --git a/test/jdk/java/awt/AppContext/ApplicationThreadsStop/ApplicationThreadsStop.java b/test/jdk/java/awt/AppContext/ApplicationThreadsStop/ApplicationThreadsStop.java deleted file mode 100644 index 48e227fc0e9..00000000000 --- a/test/jdk/java/awt/AppContext/ApplicationThreadsStop/ApplicationThreadsStop.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.awt.AWTException; -import java.awt.Frame; -import java.awt.Robot; - -import sun.awt.AppContext; -import sun.awt.SunToolkit; - -/** - * @test - * @key headful - * @bug 8136858 - * @modules java.desktop/sun.awt - * @run main/othervm/java.security.policy=java.policy -Djava.security.manager ApplicationThreadsStop - */ -public final class ApplicationThreadsStop implements Runnable { - - private static AppContext contextToDispose; - private static Thread thread; - - public static void main(final String[] args) throws Exception { - ThreadGroup tg = new ThreadGroup("TestThreadGroup"); - Thread t = new Thread(tg, new ApplicationThreadsStop()); - t.start(); - t.join(); - contextToDispose.dispose(); - // wait for appcontext to be destroyed - Thread.sleep(10000); - if(thread.isAlive()){ - throw new RuntimeException("Thread is alive"); - } - } - - @Override - public void run() { - contextToDispose = SunToolkit.createNewAppContext(); - Frame f = new Frame(); - f.setSize(300, 300); - f.setLocationRelativeTo(null); - f.setVisible(true); - thread = new Thread(() -> { - while(true); - }); - thread.start(); - sync(); - } - - private static void sync() { - try { - new Robot().waitForIdle(); - } catch (AWTException e) { - throw new RuntimeException(e); - } - } -}