`

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 {
    @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知道有多少线程从而可以控制插入的线程数
分享到:
评论

相关推荐

    JAVA100例之实例63 JAVA线程群组

    总之,Java线程群组是管理和控制多线程的重要工具,它可以帮助我们更好地组织代码,提高并发程序的可读性、可维护性和安全性。实例63将具体展示如何在实践中运用这些概念。通过深入理解并运用线程群组,我们可以编写...

    5_Executors源码阅读1

    - `threadFactory(ThreadGroup group, ThreadFactory threadFactory)`:创建一个定制的线程工厂,可以自定义线程组和线程工厂。 4. **Callable任务的转换** - `callable(Runnable task)`:将Runnable转换为...

    并发编程 75 道面试题及答案.docx

    ThreadGroup 类,可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式。但是,不推荐使用,因为使用有很多的安全隐患。 7. Executor ...

    java thread的教程

    除了基本的线程操作外,Java还提供了许多高级的API来帮助开发者更好地管理和控制线程。 **线程中断:** - **中断状态**:线程可以通过`interrupt()`方法设置中断标志。 - **检测中断**:通过`isInterrupted()`方法...

    java线程池_2.pdf

    这个简单的线程池实现展示了线程池的基本概念,但实际生产环境中,Java 提供了更为强大的 `java.util.concurrent.ExecutorService` 和 `java.util.concurrent.ThreadPoolExecutor` 类,它们提供了更多的功能和更好的...

    并发编程答案.docx

    相比之下,使用线程池(如`ExecutorService`)更加安全和高效,可以更好地管理和控制线程资源。 7. **Executor框架**:Executor框架提供了一种更高级的线程管理方式,通过`ExecutorService`接口和`...

    java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** ...通过学习上述各个方面,我们可以更好地理解和利用Java的并发机制,从而开发出更高效、更稳定的多线程应用程序。

    java 线程

    - 学习Java的线程模型,如JVM如何调度线程,可以阅读JDK源码中`java.lang.Thread`和`java.lang.ThreadGroup`的相关实现。 - 分析`synchronized`和`volatile`的底层实现,了解内存模型(Java Memory Model)对并发...

    Vert.x线程模型揭秘

    为了更好地理解Vert.x的线程模型,我们首先需要了解几个核心概念: - **Vertx对象**:它是控制整个Vert.x应用的核心。通过Vertx对象,开发者可以执行一系列操作,比如创建TCP/HTTP客户端与服务器、操作Event Bus、...

    操作系统作业 (pv,作业管理,等5个的Java实现)

    操作系统是计算机系统的核心组成部分,它负责管理和控制硬件资源,为应用程序...通过编写和调试代码,可以更好地掌握操作系统的复杂性和设计原则,这对于任何想要深入计算机系统底层的程序员来说都是宝贵的实践机会。

    Java多线程自学笔记

    ### Java多线程自学笔记知识点总结 #### 一、Java多线程概念 - **多线程定义**:多线程是指程序中可以同时执行多个线程的能力。Java虚拟机支持多线程...希望这份笔记能够帮助读者更好地理解Java多线程的相关知识。

    java 1.6 中文api文档

    这个文档以中文呈现,旨在帮助那些英语阅读能力有限或更喜欢中文阅读的开发者更好地理解和使用 Java 语言。 Java API(应用程序接口)是 Java 平台的核心组成部分,提供了大量预先定义的类和方法,用于实现各种功能...

    java程序设计于开发 第七讲 多线程

    线程组(ThreadGroup)是用来管理一组线程的容器,它自身也是线程。线程组可以包含子线程组,形成一个树形结构。线程组提供了线程的统计、监控和保护等功能,例如,可以一次性停止组内所有线程。 在实际编程中,...

    Java并发编程面试题合集.pdf

    ### Java并发编程面试题知识点详解 #### 1. 在 Java 中守护线程和本地线程的区别?...以上是《Java并发编程面试题合集》中涉及的一些核心知识点的详细解释,希望能帮助准备面试的朋友更好地理解这些概念。

    java线程源码-ng-javathread:该存储库是Nextgen关于学习Java线程的文章的源代码。请访问原始文章:

    本篇文章将深入探讨Java线程的源码,以帮助你更好地理解其工作原理。 首先,让我们来看看`Thread`类。`Thread`是Java并发编程的基础,位于`java.lang`包中。每个Java应用程序至少有一个线程,即主线程。当你创建一...

    Java面试总结~~~~.docx

    【Java面试总结】 ...同时,保持学习的动力,记录每天的学习进度,可以帮助你更好地坚持下去。在投递简历时,根据自己的经验和目标公司,选择合适的方式,积累面试经验,以便在面试中展现出最佳状态。

    spring+quartz 动态任务方案

    通过将两者结合使用,可以更好地管理定时任务,并充分利用 Spring 的特性。 #### 二、Spring与Quartz的整合概述 整合 Spring 和 Quartz 可以让开发者更加灵活地管理和控制定时任务。以下是整合的基本步骤: 1. **...

    javaConnectOpc.rar

    考虑到异步读取和订阅可能涉及多线程操作,了解Java的并发编程概念和工具(如Thread、Runnable、ExecutorService、synchronized关键字等)至关重要,以确保程序的稳定性和性能。 8. **OPC UA支持** 虽然原始的OPC...

    java实现p2p通信

    这种结构使得P2P网络具有更好的扩展性和容错性。 **2. 获得网络中可以通信端点的IP和端口** 为了实现节点间的直接通信,需要解决如何获取对方的IP地址和端口信息的问题。一种常用的方法是利用多播技术。多播技术...

    ACCP8.0S2-Y2转换教材第1、2、3章

    【第3章 高级查询(一)】在这个章节,学员将更深入地探索SQL查询技术,学习子查询、联接(JOIN)的多种类型(如内连接、外连接、自连接),以及聚合函数(如SUM, AVG, COUNT, MAX, MIN)和分组(GROUP BY)操作。...

Global site tag (gtag.js) - Google Analytics