test/java/lang/ThreadGroup/Suspend.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1999, 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, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 21,69 ****
* questions.
*/
/**
* @test
! * @bug 4176355
* @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();
! }
public void run() {
while (true) {
try {
! Thread.sleep(1000); // Give other thread a chance to start
! if (Thread.currentThread() == first)
group.suspend();
! else
! count++;
! } catch(InterruptedException e){
}
}
}
public static void main(String[] args) throws Exception {
! for (int i=0; i<2; i++)
! new Suspend();
! Thread.sleep(3000);
! boolean failed = (count > 1);
! first.stop(); second.stop();
if (failed)
throw new RuntimeException("Failure.");
}
}
--- 21,79 ----
* questions.
*/
/**
* @test
! * @bug 4176355 7181748
* @summary Suspending a ThreadGroup that contains the current thread has
* unpredictable results.
*/
+ import java.util.concurrent.CountDownLatch;
+ import java.util.concurrent.TimeUnit;
+
public class Suspend implements Runnable {
! 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());
! private static final CountDownLatch groupStarted = new CountDownLatch(2);
! private static final CountDownLatch runGroup = new CountDownLatch(1);
! private static final CountDownLatch secondContinue = new CountDownLatch(1);
! private static final CountDownLatch secondDone = new CountDownLatch(1);
public void run() {
+ groupStarted.countDown();
while (true) {
try {
! runGroup.await();
! if (Thread.currentThread() == first) {
group.suspend();
! } else {
! secondContinue.await();
! secondDone.countDown(); // should never be executed
! }
! } catch (InterruptedException ex) {
}
}
}
public static void main(String[] args) throws Exception {
! // Launch two threads as part of the same thread group
! first.start();
! second.start();
!
! groupStarted.await();
! runGroup.countDown();
! Thread.sleep(1000);
! // Suppose, the thread group is now suspended
!
! secondContinue.countDown();
!
! // Reaching zero count indicates that the second thread is still running
! boolean failed = secondDone.await(1L, TimeUnit.SECONDS);
! first.stop();
! second.stop();
if (failed)
throw new RuntimeException("Failure.");
}
}