< prev index next >

test/java/lang/ThreadGroup/Stop.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1999, 2011, 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. --- 1,7 ---- /* ! * Copyright (c) 1999, 2016, 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.
*** 26,87 **** * @bug 4176355 * @summary Stopping a ThreadGroup that contains the current thread has * unpredictable results. */ ! public class Stop implements Runnable { ! private static boolean groupStopped = false ; ! private static final Object lock = new Object(); private static final ThreadGroup group = new ThreadGroup(""); - private static final Thread first = new Thread(group, new Stop()); - private static final Thread second = new Thread(group, new Stop()); ! public void run() { ! while (true) { ! // Give the other thread a chance to start ! try { ! Thread.sleep(1000); ! } catch (InterruptedException e) { } ! // When the first thread runs, it will stop the group. ! if (Thread.currentThread() == first) { ! synchronized (lock) { try { group.stop(); ! } finally { ! // Signal the main thread it is time to check ! // that the stopped thread group was successful ! groupStopped = true; ! lock.notifyAll(); ! } ! } ! } ! } ! } public static void main(String[] args) throws Exception { // Launch two threads as part of the same thread group first.start(); second.start(); - // Wait for the thread group stop to be issued - synchronized(lock){ - while (!groupStopped) { - lock.wait(); - // Give the other thread a chance to stop - Thread.sleep(1000); - } - } - // Check that the second thread is terminated when the // first thread terminates the thread group. ! boolean failed = second.isAlive(); ! ! // Clean up any threads that may have not been terminated ! first.stop(); ! second.stop(); ! if (failed) ! throw new RuntimeException("Failure."); } } --- 26,63 ---- * @bug 4176355 * @summary Stopping a ThreadGroup that contains the current thread has * unpredictable results. */ ! import java.util.concurrent.CountDownLatch; + public class Stop { + + private static final CountDownLatch ready = new CountDownLatch(1); private static final ThreadGroup group = new ThreadGroup(""); ! private static final Thread second = new Thread(group, () -> { ! ready.countDown(); ! while (true) { // keep it alive } + }); ! private static final Thread first = new Thread(group, () -> { ! // Wait until "second" is started try { + ready.await(); + } catch (InterruptedException shouldNotHappen) {} + // Now stop the group group.stop(); ! }); public static void main(String[] args) throws Exception { // Launch two threads as part of the same thread group first.start(); second.start(); // Check that the second thread is terminated when the // first thread terminates the thread group. ! second.join(); ! // Test passed - if never get here the test times out and fails. } }
< prev index next >