# HG changeset patch # User amlu # Date 1468376771 -28800 # Node ID 1e670b11a167a8416697e970b7dab5375031c37f # Parent 7ddf0ba87d81d23169e1f3bdba594077ef4e7227 8132548: java/lang/ThreadGroup/Stop.java fails with "RuntimeException: Failure" Reviewed-by: dholmes, martin, darcy diff -r 7ddf0ba87d81 -r 1e670b11a167 jdk/test/java/lang/ThreadGroup/Stop.java --- a/jdk/test/java/lang/ThreadGroup/Stop.java Tue Jul 12 14:39:08 2016 -0700 +++ b/jdk/test/java/lang/ThreadGroup/Stop.java Wed Jul 13 10:26:11 2016 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -28,60 +28,41 @@ * unpredictable results. */ -public class Stop implements Runnable { - private static boolean groupStopped = false ; - private static final Object lock = new Object(); +import java.util.concurrent.CountDownLatch; - 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 class Stop { - public void run() { - while (true) { - // Give the other thread a chance to start - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - } + public static void main(String[] args) throws Exception { + final CountDownLatch ready = new CountDownLatch(1); + final ThreadGroup group = new ThreadGroup(""); - // 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(); - } + final Thread second = new Thread(group, () -> { + ready.countDown(); + while (true) { + try { + Thread.sleep(60000); + } catch (InterruptedException shouldNotHappen) { } } - } - } + }); - public static void main(String[] args) throws Exception { + final Thread first = new Thread(group, () -> { + // Wait until "second" is started + try { + ready.await(); + } catch (InterruptedException shouldNotHappen) { + } + // Now stop the group + group.stop(); + }); + // 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."); + second.join(); + // Test passed - if never get here the test times out and fails. } }