|  /*
 * Output:
 New thread: Thread[One,5,Group A]
 New thread: Thread[Two,5,Group A]
 One: 5
 New thread: Thread[Three,5,Group B]
 New thread: Thread[Four,5,Group B]
 
 Here is output from list():
 java.lang.ThreadGroup[name=Group A,maxpri=10]
 Thread[One,5,Group A]
 Thread[Two,5,Group A]
 java.lang.ThreadGroup[name=Group B,maxpri=10]
 Thread[Three,5,Group B]
 Thread[Four,5,Group B]
 Suspending Group A
 Three: 5
 Two: 5
 Four: 5
 Resuming Group A
 Four: 4
 Three: 4
 Waiting for threads to finish.
 Two: 4
 */
 
 class MyThread extends Thread {
 boolean suspended;
 
 MyThread(String threadname, ThreadGroup tgOb) {
 super(tgOb, threadname);
 System.out.println("New thread: " + this);
 suspended = false;
 start(); // Start the thread
 }
 
 public void run() {
 try {
 for (int i = 5; i > 0; i--) {
 System.out.println(getName() + ": " + i);
 Thread.sleep(1000);
 synchronized (this) {
 while (suspended) {
 wait();
 }
 }
 }
 } catch (Exception e) {
 System.out.println("Exception in " + getName());
 }
 System.out.println(getName() + " exiting.");
 }
 
 void suspendMe() {
 suspended = true;
 }
 
 synchronized void resumeMe() {
 suspended = false;
 notify();
 }
 }
 
 public class MainClass {
 public static void main(String args[]) {
 ThreadGroup groupA = new ThreadGroup("Group A");
 ThreadGroup groupB = new ThreadGroup("Group B");
 
 MyThread ob1 = new MyThread("One", groupA);
 MyThread ob2 = new MyThread("Two", groupA);
 MyThread ob3 = new MyThread("Three", groupB);
 MyThread ob4 = new MyThread("Four", groupB);
 
 System.out.println("\nHere is output from list():");
 groupA.list();
 groupB.list();
 
 System.out.println("Suspending Group A");
 Thread tga[] = new Thread[groupA.activeCount()];
 groupA.enumerate(tga); // get threads in group
 for (int i = 0; i < tga.length; i++) {
 ((MyThread) tga[i]).suspendMe(); // suspend each thread
 }
 
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 System.out.println("Main thread interrupted.");
 }
 
 System.out.println("Resuming Group A");
 for (int i = 0; i < tga.length; i++) {
 ((MyThread) tga[i]).resumeMe();
 }
 
 try {
 System.out.println("Waiting for threads to finish.");
 ob1.join();
 ob2.join();
 ob3.join();
 ob4.join();
 } catch (Exception e) {
 System.out.println("Exception in Main thread");
 }
 System.out.println("Main thread exiting.");
 }
 }
 
 
 
 
 
 |