Java 创建线程池两种不同方法的比较
2013-06-02 22:22
302 查看
用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源。要用到多线程的等方面,也就免不了对线程的控制或用到线程池。 我在做我们现在的那一个抓取框架的时候,就曾经用过java.util.concurrent.ExecutorService作为线程池,关于ExecutorService的使用代码大概如下:
java.util.concurrent.Executors类的API提供大量创建连接池的静态方法:
1.固定大小的线程池:
后来发现ExecutorService的功能没有想像中的那么好,而且最多只是提供一个线程的容器而然,所以后来我用改用了java.lang.ThreadGroup,ThreadGroup有很多优势,最重要的一点就是它可以对线程进行遍历,知道那些线程已经运行完毕,还有那些线程在运行。关于ThreadGroup的使用代码如下:
由以上的代码可以看出:ThreadGroup比ExecutorService多以下几个优势 1.ThreadGroup可以遍历线程,知道那些线程已经运行完毕,那些还在运行 2.可以通过ThreadGroup.activeCount知道有多少线程从而可以控制插入的线程数
这篇文章来自博客园:http://www.cnblogs.com/yy2011/archive/2011/05/05/2037564.html
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 { @Override public 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知道有多少线程从而可以控制插入的线程数
这篇文章来自博客园:http://www.cnblogs.com/yy2011/archive/2011/05/05/2037564.html
相关文章推荐
- Java 创建线程池两种不同方法的比较
- java 创建多线程两种方法比较
- Java创建线程的两种方法比较
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- java中创建线程的两种方法及比较
- Java创建线程的两种方法比较
- java创建线程的两种方法比较
- (转)java创建线程的两种方法比较
- java--创建多线程两种方法的比较
- Java Notes: Java的多线程创建的两种方法以及Race Condition的解释
- Java中五种不同方法的创建对象
- Java 多线程池ThreadPoolExecutor解析及Executors类中提供的静态方法来创建线程池
- Java中Executors类中几种创建各类型线程池的方法及实例
- java 创建线程的三种方法Callable,Runnable,Thread比较及用法
- Java【多线程知识总结(5)】比较继承Thread类创建线程和实现Runnable接口创建线程这两种方式
- JAVA - 多线程 两种方法的比较
- 比较两种php调用Java对象的方法
- java创建子线程为什么要有两种方法?
- Java中两种区别不同类型Exception的方法
- java多线程总结一:线程的两种创建方式及优劣比较