7181748: java/lang/ThreadGroup/Suspend.java test fails intermittently
authorigerasim
Thu, 13 Jun 2013 15:15:03 +0400
changeset 18172 f82c2fc6a875
parent 18171 2725a30c1a02
child 18173 cf70549231af
7181748: java/lang/ThreadGroup/Suspend.java test fails intermittently Reviewed-by: chegar, dholmes
jdk/test/java/lang/ThreadGroup/Suspend.java
--- a/jdk/test/java/lang/ThreadGroup/Suspend.java	Thu Jun 13 11:13:30 2013 +0200
+++ b/jdk/test/java/lang/ThreadGroup/Suspend.java	Thu Jun 13 15:15:03 2013 +0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013 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
@@ -23,47 +23,55 @@
 
 /**
  * @test
- * @bug 4176355
+ * @bug 4176355 7181748
  * @summary Suspending a ThreadGroup that contains the current thread has
  *          unpredictable results.
  */
 
 public class Suspend implements Runnable {
-    private static Thread first=null;
-    private static Thread second=null;
-    private static ThreadGroup group = new ThreadGroup("");
-    private static int count = 0;
 
-    Suspend() {
-        Thread thread = new Thread(group, this);
-        if (first == null)
-            first = thread;
-        else
-            second = thread;
-
-        thread.start();
-    }
+    private static volatile int count = 0;
+    private static final ThreadGroup group = new ThreadGroup("");
+    private static final Thread first = new Thread(group, new Suspend());
+    private static final Thread second = new Thread(group, new Suspend());
 
     public void run() {
         while (true) {
             try {
-                Thread.sleep(1000); // Give other thread a chance to start
-                if (Thread.currentThread() == first)
-                    group.suspend();
-                else
+                Thread.sleep(100);
+                if (Thread.currentThread() == first) {
+                    if (second.isAlive()) {
+                        group.suspend();
+                    }
+                } else {
                     count++;
-            } catch(InterruptedException e){
+                }
+            } catch (InterruptedException e) {
             }
         }
     }
 
     public static void main(String[] args) throws Exception {
-        for (int i=0; i<2; i++)
-            new Suspend();
-        Thread.sleep(3000);
+        // Launch two threads as part of the same thread group
+        first.start();
+        second.start();
+
+        // Wait for the thread group suspend to be issued
+        while (!first.isAlive() || !second.isAlive()) {
+            Thread.sleep(100);
+        }
+        Thread.sleep(1000);
+        // Suppose, the thread group is now suspended
+
+        count = 0;
+        Thread.sleep(1000);
+
+        // Increment of the count indicates that the second thread is still running
         boolean failed = (count > 1);
-        first.stop(); second.stop();
-        if (failed)
+        first.stop();
+        second.stop();
+        if (failed) {
             throw new RuntimeException("Failure.");
+        }
     }
 }