Java Tutorial/Thread/ThreadGroup

Материал из Java эксперт
Перейти к: навигация, поиск

Add thread to thread group

   <source lang="java">

class ThreadGroupDemo1 {

 public static void main(String[] args) {
   ThreadGroup tg = new ThreadGroup("My ThreadGroup");
   MyThread mt = new MyThread(tg, "My Thread");
   mt.start();
 }

} class MyThread extends Thread {

 MyThread(ThreadGroup tg, String name) {
   super(tg, name);
 }
 public void run() {
   ThreadGroup tg = getThreadGroup();
   System.out.println(tg.getName());
 }

}</source>





Demonstrate thread groups.

   <source lang="java">

class NewThread extends Thread {

 boolean suspendFlag;
 NewThread(String threadname, ThreadGroup tgOb) {
   super(tgOb, threadname);
   suspendFlag = false;
   start();
 }
 public void run() {
   try {
     for (int i = 5; i > 0; i--) {
       System.out.println(getName() + ": " + i);
       Thread.sleep(1000);
       synchronized (this) {
         while (suspendFlag) {
           wait();
         }
       }
     }
   } catch (Exception e) {
     System.out.println("Exception in " + getName());
   }
 }
 void mysuspend() {
   suspendFlag = true;
 }
 synchronized void myresume() {
   suspendFlag = false;
   notify();
 }

} class ThreadGroupDemo {

 public static void main(String args[]) {
   ThreadGroup groupA = new ThreadGroup("Group A");
   ThreadGroup groupB = new ThreadGroup("Group B");
   NewThread ob1 = new NewThread("One", groupA);
   NewThread ob2 = new NewThread("Two", groupA);
   NewThread ob3 = new NewThread("Three", groupB);
   NewThread ob4 = new NewThread("Four", groupB);
   groupA.list();
   groupB.list();
   Thread tga[] = new Thread[groupA.activeCount()];
   groupA.enumerate(tga); 
   for (int i = 0; i < tga.length; i++) {
     ((NewThread) tga[i]).mysuspend(); 
   }
   try {
     Thread.sleep(4000);
   } catch (InterruptedException e) {
     System.out.println("Main thread interrupted.");
   }
   System.out.println("Resuming Group A");
   for (int i = 0; i < tga.length; i++) {
     ((NewThread) tga[i]).myresume(); 
   }
   try {
     ob1.join();
     ob2.join();
     ob3.join();
     ob4.join();
   } catch (Exception e) {
     System.out.println("Exception in Main thread");
   }
 }

}</source>





Get parent thread group

   <source lang="java">

class Main {

 public static void main(String[] args) throws Exception {
   ThreadGroup tg = Thread.currentThread().getThreadGroup();
   MyThread mt1 = new MyThread(tg, "first");
   MyThread mt2 = new MyThread(tg, "second");
   mt1.start();
   mt2.start();
   ThreadGroup parent = tg.getParent();
   Thread[] list = new Thread[parent.activeCount()];
   int count = parent.enumerate(list, true);
   String[] thdinfo = new String[count];
   for (int i = 0; i < count; i++)
     thdinfo[i] = list[i].toString();
   mt1.join();
   mt2.join();
   for (int i = 0; i < count; i++)
     System.out.println(thdinfo[i]);
 }

} class MyThread extends Thread {

 MyThread(ThreadGroup tg, String name) {
   super(tg, name);
 }
 public void run() {
   for (char c = "A"; c <= "Z"; c++)
     System.out.println(c);
   try {
     Thread.sleep(1000);
   } catch (InterruptedException e) {
   }
 }

}</source>





Listing all threads and threadgroups in the VM

   <source lang="java">

/*

* Copyright (c) 2004 David Flanagan.  All rights reserved.
* This code is from the book Java Examples in a Nutshell, 3nd Edition.
* It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
* You may study, use, and modify it for any non-commercial purpose,
* including teaching and use in open-source projects.
* You may distribute it non-commercially as long as you retain this notice.
* For a commercial use license, or to purchase the book, 
* please visit http://www.davidflanagan.ru/javaexamples3.
*/

import java.awt.BorderLayout; import java.io.PrintWriter; import java.io.StringWriter; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; /**

* This class contains a useful static method for listing all threads and
* threadgroups in the VM. It also has a simple main() method so it can be run
* as a standalone program.
*/

public class ThreadLister {

 /** Display information about a thread. */
 private static void printThreadInfo(PrintWriter out, Thread t, String indent) {
   if (t == null)
     return;
   out.println(indent + "Thread: " + t.getName() + "  Priority: " + t.getPriority()
       + (t.isDaemon() ? " Daemon" : "") + (t.isAlive() ? "" : " Not Alive"));
 }
 /** Display info about a thread group and its threads and groups */
 private static void printGroupInfo(PrintWriter out, ThreadGroup g, String indent) {
   if (g == null)
     return;
   int num_threads = g.activeCount();
   int num_groups = g.activeGroupCount();
   Thread[] threads = new Thread[num_threads];
   ThreadGroup[] groups = new ThreadGroup[num_groups];
   g.enumerate(threads, false);
   g.enumerate(groups, false);
   out.println(indent + "Thread Group: " + g.getName() + "  Max Priority: " + g.getMaxPriority()
       + (g.isDaemon() ? " Daemon" : ""));
   for (int i = 0; i < num_threads; i++)
     printThreadInfo(out, threads[i], indent + "    ");
   for (int i = 0; i < num_groups; i++)
     printGroupInfo(out, groups[i], indent + "    ");
 }
 /** Find the root thread group and list it recursively */
 public static void listAllThreads(PrintWriter out) {
   ThreadGroup current_thread_group;
   ThreadGroup root_thread_group;
   ThreadGroup parent;
   // Get the current thread group
   current_thread_group = Thread.currentThread().getThreadGroup();
   // Now go find the root thread group
   root_thread_group = current_thread_group;
   parent = root_thread_group.getParent();
   while (parent != null) {
     root_thread_group = parent;
     parent = parent.getParent();
   }
   // And list it, recursively
   printGroupInfo(out, root_thread_group, "");
 }
 /**
  * The main() method create a simple graphical user interface to display the
  * threads in. This allows us to see the "event dispatch thread" used by AWT
  * and Swing.
  */
 public static void main(String[] args) {
   // Create a simple Swing GUI
   JFrame frame = new JFrame("ThreadLister Demo");
   JTextArea textarea = new JTextArea();
   frame.getContentPane().add(new JScrollPane(textarea), BorderLayout.CENTER);
   frame.setSize(500, 400);
   frame.setVisible(true);
   // Get the threadlisting as a string using a StringWriter stream
   StringWriter sout = new StringWriter(); // To capture the listing
   PrintWriter out = new PrintWriter(sout);
   ThreadLister.listAllThreads(out); // List threads to stream
   out.close();
   String threadListing = sout.toString(); // Get listing as a string
   // Finally, display the thread listing in the GUI
   textarea.setText(threadListing);
 }

}</source>