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

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 {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在执行。。。");}
}

后来发现ExecutorService的功能没有想像中的那么好,而且最多只是提供一个线程的容器而然,所以后来我用改用了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比ExecutorService多以下几个优势

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

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

转载于:https://www.cnblogs.com/onlywujun/p/3514564.html

ThreadGroup其实比ExecutorService更好相关推荐

  1. Netty序章之BIO NIO AIO演变

    Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...

  2. Java IO模型--BIO、NIO Single Thread、NIO Reactor、AIO单线程及多线程AIO

    目录 BIO server端: client端: NIO 单线程模型 Reactor模型 代码实现 AIO 单线程AIO代码实现 线程池AIO代码实现 BIO 当确定客户端连接数很少时,BIO也可以使 ...

  3. [转]Java AIO学习

    java AIO学习 转载  http://blog.csdn.net/zhongweijian/article/details/8005444 系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步 ...

  4. Java中的IO、NIO、File、BIO、AIO详解

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?         Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...

  5. JUC探险-17、线程池

    文章目录 一.线程:   ①线程的创建     如果同时继承了Thread类且实现了Runnable接口,会怎样执行?   ②线程状态   ③线程状态的转换     线程状态的转换操作       1 ...

  6. Java网络IO演进之路

    前言 说起IO,很多人对它应该都有所耳闻,可能很多人对IO都有着一种既熟悉又陌生的感觉,因为IO这一块内容还是比较广泛杂乱的,整个IO的体系也是十分庞大.那么IO到底是个什么东西呢?IO 是主存和外部 ...

  7. 分布式专题-NIO框架之Netty01-Java IO 演进之路

    目录导航 前言 Java IO 阻塞(Block)和非阻塞(Non-Block) 同步(Synchronization)和异步(Asynchronous) Java BIO 与 Java NIO Ja ...

  8. java 多线程,及获取线程执行结果

    2019独角兽企业重金招聘Python工程师标准>>> Thread.Runnable 创建多线程 new Thread(new Runnable() {public void ru ...

  9. 谈谈java的bio、nio、aio模型

    目录 socket IO(BIO)和NIO的区别 同步和异步 bio:同步阻塞式IO NIO:同步非阻塞IO(工作中用的很少) Buffer使用 NIO代码 AIO socket Socket又称&q ...

最新文章

  1. # HDU - 6185 Covering
  2. linux下的shell编程
  3. osg下物体绕自身轴旋转
  4. runtime的意义
  5. luoguP1090 合并果子 (贪心+优先队列)
  6. 【转】C语言条件编译及编译预处理阶段
  7. 利用 SQL Monitor 查看语句运行状态步骤
  8. Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
  9. C++ 已知两点坐标和半径求圆心坐标程序
  10. C语言中callback回调函数,C++回调函数(callback)的使用
  11. pythonpost请求json_将JSON字符串作为post请求发送
  12. 南阳oj 韩信点兵
  13. 海外问卷调查,招募合伙人
  14. 人工智能初步学习笔记
  15. 万丈高楼平地起,基础很重要
  16. linux中test的用法,如何在Linux中使用test命令
  17. 少说话多写代码之Python学习017——字典的方法(items、pop)
  18. centos挂载光驱设备
  19. c语言随机生成四则运算10道,c语言编10道四则运算题
  20. 计算机动画专业要学什么课程,学动画专业的应该用什么什么配置的笔记本电脑?...

热门文章

  1. 蒙特卡罗(Monte Carlo)方法
  2. Django多进程中的查询错乱问题以及mysql gone away问题
  3. google 浏览器清除缓存
  4. linux usr g 空间不足,centos 磁盘空间不足
  5. 全面解析Java中的String数据类型
  6. 第三篇:Mysql存储引擎
  7. Map、HashMap、TreeMap、LinkedHashMap
  8. 前端路由的概念与原理
  9. linux过滤输出内容,Linux内容整理--过滤器、输入输出及管道
  10. java预期_预期. java的