Race condition in ThreadGroup stop test

Gary Adams gary.adams at oracle.com
Wed Nov 9 19:09:34 UTC 2011


  Captured the latest round of comments
     - more readable initialization
     - allow sleep interruption to terminate main thread
     - added current CR# to @bug tag

     24    /**
     25     * @test
     26     * @bug 4176355 7084033
     27     * @summary Stopping a ThreadGroup that contains the current thread has
     28     *          unpredictable results.
     29     */
     30
     31    public class Stop implements Runnable {
     32        private static boolean groupStopped = false ;
     33        private static final Object lock = new Object();
     34
     35        private static final ThreadGroup group = new ThreadGroup("");
     36        private static final Thread first = new Thread(group, new Stop());
     37        private static final Thread second = new Thread(group, new Stop());
     38
     39        public void run() {
     40            while (true) {
     41                // Give the other thread a chance to start
     42                try {
     43                    Thread.sleep(1000);
     44                } catch (InterruptedException e) {
     45                }
     46
     47                // When the first thread runs, it will stop the group.
     48                if (Thread.currentThread() == first) {
     49                    synchronized (lock) {
     50                        try {
     51                            group.stop();
     52                        } finally {
     53                            // Signal the main thread it is time to check
     54                            // that the stopped thread group was successful
     55                            groupStopped = true;
     56                            lock.notifyAll();
     57                        }
     58                    }
     59                }
     60            }
     61        }
     62
     63        public static void main(String[] args) throws Exception {
     64            // Launch two threads as part of the same thread group
     65            second.start();
     66            first.start();
     67
     68            // Wait for the thread group stop to be issued
     69            synchronized(lock){
     70                while (!groupStopped) {
     71                    lock.wait();
     72                    // Give the other thread a chance to stop
     73                    Thread.sleep(1000);
     74                }
     75            }
     76
     77            // Check that the second thread is terminated when the
     78            // first thread terminates the thread group.
     79            boolean failed = second.isAlive();
     80
     81            // Clean up any threads that may have not been terminated
     82            first.stop();
     83            second.stop();
     84            if (failed)
     85                throw new RuntimeException("Failure.");
     86        }
     87    }




More information about the core-libs-dev mailing list