免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6651 | 回复: 2
打印 上一主题 下一主题

ThreadGroup其实比ExecutorService更好(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-17 16:06 |只看该作者 |倒序浏览

ThreadGroup其实比ExecutorService更好(转)


.


    用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源。要用到多线程的等方面,也就免不了对线程的控制或用到线程池。   我在做我们现在的那一个抓取框架的时候,就曾经用过java.util.concurrent.ExecutorService作为线程池,关于ExecutorService的使用代码大概如下:
java.util.concurrent.Executors类的API提供大量创建连接池的静态方法:1.固定大小的线程池:



1
  1. package BackStage;
  2. 2
  3. 3  import java.util.concurrent.Executors;
  4. 4  import java.util.concurrent.ExecutorService;
  5. 5
  6. 6  public class JavaThreadPool {
  7. 7     public static void main(String[] args) {
  8. 8         // 创建一个可重用固定线程数的线程池
  9. 9          ExecutorService pool = Executors.newFixedThreadPool(2);
  10. 10         // 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
  11. 11         Thread t1 = new MyThread();
  12. 12         Thread t2 = new MyThread();
  13. 13         Thread t3 = new MyThread();
  14. 14         Thread t4 = new MyThread();
  15. 15         Thread t5 = new MyThread();
  16. 16         // 将线程放入池中进行执行
  17. 17         pool.execute(t1);
  18. 18         pool.execute(t2);
  19. 19         pool.execute(t3);
  20. 20         pool.execute(t4);
  21. 21         pool.execute(t5);
  22. 22         // 关闭线程池
  23. 23         pool.shutdown();
  24. 24     }
  25. 25 }
  26. 26
  27. 27 class MyThread extends Thread {
  28. 28     @Override
  29. 29     public void run() {
  30. 30         System.out.println(Thread.currentThread().getName() + "正在执行。。。");
  31. 31     }
  32. 32 }
复制代码
复制代码

   后来发现ExecutorService的功能没有想像中的那么好,而且最多只是提供一个线程的容器而然,所以后来我用改用了java.lang.ThreadGroup,ThreadGroup有很多优势,最重要的一点就是它可以对线程进行遍历,知道那些线程已经运行完毕,还有那些线程在运行。关于ThreadGroup的使用代码如下:
  1. 1 class MyThread extends Thread {
  2. 2   boolean stopped;
  3. 3
  4. 4   MyThread(ThreadGroup tg, String name) {
  5. 5     super(tg, name);
  6. 6     stopped = false;
  7. 7   }
  8. 8
  9. 9   public void run() {
  10. 10     System.out.println(Thread.currentThread().getName() + " starting.");
  11. 11     try {
  12. 12       for (int i = 1; i < 1000; i++) {
  13. 13         System.out.print(".");
  14. 14         Thread.sleep(250);
  15. 15         synchronized (this) {
  16. 16           if (stopped)
  17. 17             break;
  18. 18         }
  19. 19       }
  20. 20     } catch (Exception exc) {
  21. 21       System.out.println(Thread.currentThread().getName() + " interrupted.");
  22. 22     }
  23. 23     System.out.println(Thread.currentThread().getName() + " exiting.");
  24. 24   }
  25. 25
  26. 26   synchronized void myStop() {
  27. 27     stopped = true;
  28. 28   }
  29. 29 }
  30. 30
  31. 31 public class Main {
  32. 32   public static void main(String args[]) throws Exception {
  33. 33     ThreadGroup tg = new ThreadGroup("My Group");
  34. 34
  35. 35     MyThread thrd = new MyThread(tg, "MyThread #1");
  36. 36     MyThread thrd2 = new MyThread(tg, "MyThread #2");
  37. 37     MyThread thrd3 = new MyThread(tg, "MyThread #3");
  38. 38
  39. 39     thrd.start();
  40. 40     thrd2.start();
  41. 41     thrd3.start();
  42. 42
  43. 43     Thread.sleep(1000);
  44. 44
  45. 45     System.out.println(tg.activeCount() + " threads in thread group.");
  46. 46
  47. 47     Thread thrds[] = new Thread[tg.activeCount()];
  48. 48     tg.enumerate(thrds);
  49. 49     for (Thread t : thrds)
  50. 50       System.out.println(t.getName());
  51. 51
  52. 52     thrd.myStop();
  53. 53
  54. 54     Thread.sleep(1000);
  55. 55     
  56. 56     System.out.println(tg.activeCount() + " threads in tg.");
  57. 57     tg.interrupt();
  58. 58   }
  59. 59 }
复制代码
复制代码

  由以上的代码可以看出:ThreadGroup比ExecutorService多以下几个优势  

1.ThreadGroup可以遍历线程,知道那些线程已经运行完毕,那些还在运行  

2.可以通过ThreadGroup.activeCount知道有多少线程从而可以控制插入的线程数

转自: http://www.cnblogs.com/jimmy0756/archive/2011/04/18/2019439.html

论坛徽章:
0
2 [报告]
发表于 2012-02-17 22:12 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2013-12-06 11:54 |只看该作者
不能说谁比谁好,ExcutorService也不是用来替代ThreadGroup.
ExecutorService体现的是对线程池的管理,线程池可不是仅启动几个线程而已,需要体现资源的管理。而ThreadGroup功能相对有限
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP