ThreadGroup

3803 ワード

ThreadGroup
http://www.cnblogs.com/yy2011/archive/2011/05/05/2037564.html
 javaでキャプチャする時はマルチスレッドを使う必要があります.同時に複数のウェブサイトやスレッドを持って一つのウェブサイトをキャプチャするには遅すぎます.また、同じウェブサイトをスレッドでつかむにはCPU資源を浪費することもあります.マルチスレッドなどを使うには、スレッドの制御や使用が欠かせません.   私たちは現在のフレームワークをする時に、java.util.co ncurrent.ExectorServiceをスレッド池として使ったことがあります.Exector Serviceの使用コードは大体次の通りです.java.util.co.Exectors類のAPIは接続池を大量に作る静的な方法を提供します.
package BackStage;
 
  import java.util.concurrent.Executors;
  import java.util.concurrent.ExecutorService;
 
  public class JavaThreadPool {
     public static void main(String[] args) {
         //                 
          ExecutorService pool = Executors.newFixedThreadPool(2);
         //      Runnable    ,Thread        Runnable  
         Thread t1 = new MyThread();
         Thread t2 = new MyThread();
         Thread t3 = new MyThread();
         Thread t4 = new MyThread();
         Thread t5 = new MyThread();
         //            
         pool.execute(t1);
         pool.execute(t2);
         pool.execute(t3);
         pool.execute(t4);
         pool.execute(t5);
         //      
         pool.shutdown();
     }
 }
 
 class MyThread extends Thread {
     @Override
     public void run() {
         System.out.println(Thread.currentThread().getName() + "    。。。");
     }
 }
 その後、私はjava.lang.ThreadGroupに変えました.ThreadGroupは多くの利点があります.最も重要な点はスレッドを巡回して、スレッドがすでに運行されていることを知っています.ThreadGroupの使用コードは以下の通りです.
class MyThread extends Thread {
   boolean stopped;
 
   MyThread(ThreadGroup tg, String name) {
     super(tg, name);
     stopped = false;
   }
 
   public void run() {
     System.out.println(Thread.currentThread().getName() + " starting.");
     try {
       for (int i = 1; i < 1000; i++) {
         System.out.print(".");
         Thread.sleep(250);
         synchronized (this) {
           if (stopped)
             break;
         }
       }
     } catch (Exception exc) {
       System.out.println(Thread.currentThread().getName() + " interrupted.");
     }
     System.out.println(Thread.currentThread().getName() + " exiting.");
   }
 
   synchronized void myStop() {
     stopped = true;
   }
 }
 
 public class Main {
   public static void main(String args[]) throws Exception {
     ThreadGroup tg = new ThreadGroup("My Group");
 
     MyThread thrd = new MyThread(tg, "MyThread #1");
     MyThread thrd2 = new MyThread(tg, "MyThread #2");
     MyThread thrd3 = new MyThread(tg, "MyThread #3");
 
     thrd.start();
     thrd2.start();
     thrd3.start();
 
     Thread.sleep(1000);
 
     System.out.println(tg.activeCount() + " threads in thread group.");
 
     Thread thrds[] = new Thread[tg.activeCount()];
     tg.enumerate(thrds);
     for (Thread t : thrds)
       System.out.println(t.getName());
 
     thrd.myStop();
 
     Thread.sleep(1000);
     
     System.out.println(tg.activeCount() + " threads in tg.");
     tg.interrupt();
   }
 }
  以上のコードから見られます.ThreadGroupはExectorServiceより以下のいくつかの利点があります.  
1.ThreadGroupはスレッドを巡回することができます.それらのスレッドはすでに実行済みで、まだ実行中です.  
2.ThreadGroup.activeCountを通じて、どれぐらいのスレッドがあるかを知ることができます.挿入スレッド数を制御できます.