分享java帶來的快樂

          我喜歡java新東西

          java 線程組

          ThreadGroup其實(shí)比ExecutorService更好
           
             用java做抓取的時(shí)候免不了要用到多線程的了,因?yàn)橐瑫r(shí)抓取多個(gè)網(wǎng)站或一條線程抓取一個(gè)網(wǎng)站的話實(shí)在太慢,而且有時(shí)一條線程抓取同一個(gè)網(wǎng)站的話也比較浪費(fèi)CPU資源。要用到多線程的等方面,也就免不了對線程的控制或用到線程池。   我在做我們現(xiàn)在的那一個(gè)抓取框架的時(shí)候,就曾經(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)建一個(gè)可重用固定線程數(shù)的線程池
                   ExecutorService pool = Executors.newFixedThreadPool(2);
                  // 創(chuàng)建實(shí)現(xiàn)了Runnable接口對象,Thread對象當(dāng)然也實(shí)現(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的功能沒有想像中的那么好,而且最多只是提供一個(gè)線程的容器而然,所以后來我用改用了java.lang.ThreadGroup,ThreadGroup有很多優(yōu)勢,最重要的一點(diǎn)就是它可以對線程進(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多以下幾個(gè)優(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) 閱讀(3314) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 兴安盟| 大埔区| 乐安县| 余姚市| 大城县| 明溪县| 阜城县| 新余市| 老河口市| 孝感市| 宁武县| 从化市| 江华| 图们市| 桦川县| 海丰县| 琼结县| 平南县| 双柏县| 蒲江县| 醴陵市| 富锦市| 锦屏县| 澄迈县| 治县。| 女性| 温泉县| 区。| 卫辉市| 朝阳市| 丰顺县| 饶河县| 黄平县| 宜兰市| 台州市| 佛山市| 云安县| 大埔县| 南雄市| 梓潼县| 化州市|