ThreadGroup其实比ExecutorService更好
用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更好相关推荐
- Netty序章之BIO NIO AIO演变
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...
- Java IO模型--BIO、NIO Single Thread、NIO Reactor、AIO单线程及多线程AIO
目录 BIO server端: client端: NIO 单线程模型 Reactor模型 代码实现 AIO 单线程AIO代码实现 线程池AIO代码实现 BIO 当确定客户端连接数很少时,BIO也可以使 ...
- [转]Java AIO学习
java AIO学习 转载 http://blog.csdn.net/zhongweijian/article/details/8005444 系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步 ...
- Java中的IO、NIO、File、BIO、AIO详解
java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...
- JUC探险-17、线程池
文章目录 一.线程: ①线程的创建 如果同时继承了Thread类且实现了Runnable接口,会怎样执行? ②线程状态 ③线程状态的转换 线程状态的转换操作 1 ...
- Java网络IO演进之路
前言 说起IO,很多人对它应该都有所耳闻,可能很多人对IO都有着一种既熟悉又陌生的感觉,因为IO这一块内容还是比较广泛杂乱的,整个IO的体系也是十分庞大.那么IO到底是个什么东西呢?IO 是主存和外部 ...
- 分布式专题-NIO框架之Netty01-Java IO 演进之路
目录导航 前言 Java IO 阻塞(Block)和非阻塞(Non-Block) 同步(Synchronization)和异步(Asynchronous) Java BIO 与 Java NIO Ja ...
- java 多线程,及获取线程执行结果
2019独角兽企业重金招聘Python工程师标准>>> Thread.Runnable 创建多线程 new Thread(new Runnable() {public void ru ...
- 谈谈java的bio、nio、aio模型
目录 socket IO(BIO)和NIO的区别 同步和异步 bio:同步阻塞式IO NIO:同步非阻塞IO(工作中用的很少) Buffer使用 NIO代码 AIO socket Socket又称&q ...
最新文章
- # HDU - 6185 Covering
- linux下的shell编程
- osg下物体绕自身轴旋转
- runtime的意义
- luoguP1090 合并果子 (贪心+优先队列)
- 【转】C语言条件编译及编译预处理阶段
- 利用 SQL Monitor 查看语句运行状态步骤
- Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
- C++ 已知两点坐标和半径求圆心坐标程序
- C语言中callback回调函数,C++回调函数(callback)的使用
- pythonpost请求json_将JSON字符串作为post请求发送
- 南阳oj 韩信点兵
- 海外问卷调查,招募合伙人
- 人工智能初步学习笔记
- 万丈高楼平地起,基础很重要
- linux中test的用法,如何在Linux中使用test命令
- 少说话多写代码之Python学习017——字典的方法(items、pop)
- centos挂载光驱设备
- c语言随机生成四则运算10道,c语言编10道四则运算题
- 计算机动画专业要学什么课程,学动画专业的应该用什么什么配置的笔记本电脑?...