分享java帶來的快樂

          我喜歡java新東西

          java 線程組

          ThreadGroup其實比ExecutorService更好
           
             用java做抓取的時候免不了要用到多線程的了,因為要同時抓取多個網(wǎng)站或一條線程抓取一個網(wǎng)站的話實在太慢,而且有時一條線程抓取同一個網(wǎng)站的話也比較浪費(fèi)CPU資源。要用到多線程的等方面,也就免不了對線程的控制或用到線程池。   我在做我們現(xiàn)在的那一個抓取框架的時候,就曾經(jīng)用過java.util.concurrent.ExecutorService作為線程池,關(guān)于ExecutorService的使用代碼大概如下:
          java.util.concurrent.Executors類的API提供大量創(chuàng)建連接池的靜態(tài)方法:1.固定大小的線程池:
           


          package BackStage;

           import java.util.concurrent.Executors;
           import java.util.concurrent.ExecutorService;

           public class JavaThreadPool {
              public static void main(String[] args) {
                  // 創(chuàng)建一個可重用固定線程數(shù)的線程池
                   ExecutorService pool = Executors.newFixedThreadPool(2);
                  // 創(chuàng)建實現(xiàn)了Runnable接口對象,Thread對象當(dāng)然也實現(xiàn)了Runnable接口
                  Thread t1 = new MyThread();
                  Thread t2 = new MyThread();
                  Thread t3 = new MyThread();
                  Thread t4 = new MyThread();
                  Thread t5 = new MyThread();
                  // 將線程放入池中進(jìn)行執(zhí)行
                  pool.execute(t1);
                  pool.execute(t2);
                  pool.execute(t3);
                  pool.execute(t4);
                  pool.execute(t5);
                  // 關(guān)閉線程池
                  pool.shutdown();
              }
          }

          class MyThread extends Thread {
              @Override
              public void run() {
                  System.out.println(Thread.currentThread().getName() + "正在執(zhí)行。。。");
              }
          }


             后來發(fā)現(xiàn)ExecutorService的功能沒有想像中的那么好,而且最多只是提供一個線程的容器而然,所以后來我用改用了java.lang.ThreadGroup,ThreadGroup有很多優(yōu)勢,最重要的一點就是它可以對線程進(jìn)行遍歷,知道那些線程已經(jīng)運(yùn)行完畢,還有那些線程在運(yùn)行。關(guān)于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比ExecutorService多以下幾個優(yōu)勢 
           
          1.ThreadGroup可以遍歷線程,知道那些線程已經(jīng)運(yùn)行完畢,那些還在運(yùn)行 
           
          2.可以通過ThreadGroup.activeCount知道有多少線程從而可以控制插入的線程數(shù)

          posted on 2012-06-28 08:53 強(qiáng)強(qiáng) 閱讀(3303) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 石渠县| 株洲县| 汶川县| 琼结县| 新干县| 基隆市| 偃师市| 象州县| 哈巴河县| 高平市| 宁安市| 义马市| 上栗县| 迁西县| 文水县| 岐山县| 甘洛县| 樟树市| 台东市| 湖北省| 东宁县| 九龙坡区| 昌乐县| 库伦旗| 电白县| 衡水市| 栾川县| 施秉县| 于田县| 沧州市| 磐安县| 项城市| 弋阳县| 临沂市| 安龙县| 什邡市| 嘉祥县| 沾化县| 垦利县| 武邑县| 金昌市|