- 浏览: 265342 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (298)
- 工作感悟 (6)
- java基础 (23)
- 计算机硬件知识 (1)
- 计算机网络知识 (2)
- Struts (3)
- Srping (4)
- hibernate (0)
- ibatis (0)
- webservice (4)
- Thread (22)
- maven (5)
- ubuntu/linux/centos/redhat (46)
- SSO (1)
- ESB (0)
- 工作流 (0)
- oracle (15)
- 云计算 (1)
- hadoop (1)
- nosql (0)
- mysql (3)
- sqlserver (0)
- jquery (0)
- 分布式 (3)
- 集群 (0)
- 设计模式 (2)
- EJB (0)
- map (0)
- cache (5)
- Niginx+varnish+squid+Ats (14)
- Apache (0)
- 工作/职业规划 (0)
- Scala & Groovy (1)
- English (4)
- 数据结构/算法 (6)
- 开发工具 (5)
- 测试 (2)
- Exception (0)
- 定时器 (3)
- j2ee (2)
- 部署 (1)
- Openssl (1)
- 操作系统 (3)
- kvm (13)
- libvirt (5)
- PostgreSql (5)
- 虚拟化 (3)
- 概念理解 (1)
- virt-manager (1)
- RESTful (3)
- 其它 (4)
- ssh2 (14)
- windows (1)
- 房产 (2)
- svn (1)
- 手机 (1)
- ant (1)
- flume (2)
- sqoop (1)
- fastdfs (5)
- log4j (1)
- SPDY (1)
- mongodb (2)
- MQ (2)
- Mina (1)
- dubbo (4)
- PMP (1)
- Webshpere (2)
- jvm (1)
- Btrace (1)
- zookeeper (7)
- UML (1)
- spring cloud (6)
- spring boot (5)
- storm (0)
- 软件管理 (1)
- elasticsearch (1)
- 协议 (2)
- docker (1)
- 性能 (2)
- 安全 (1)
- 代码规范 (1)
- mqtt (1)
- lombok (1)
- 车联网 (1)
- kafka (1)
最新评论
用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知道有多少线程从而可以控制插入的线程数
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知道有多少线程从而可以控制插入的线程数
发表评论
-
Java通过Executors提供四种线程池
2017-09-27 10:21 468Java通过Executors提供四种线程池,分别为: new ... -
并发线程组件 Amino
2013-07-23 13:29 695Amino CBB (Concurrent Building ... -
Java多线程之Semaphore
2013-07-17 16:12 582import java.util.ArrayL ... -
ThreadLocal的介绍(利用变量副本实现多线程访问同一变量)
2013-07-17 14:20 803早在Java 1.2推出之时,Ja ... -
Java多线程同步器
2013-07-12 17:00 860CyclcBarrier 在实际应用中,有时候需要多个线程 ... -
Java Thread.interrupt 害人! 中断JAVA线程
2013-07-12 16:37 768程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难 ... -
Java多线程学习——Condition的使用
2013-07-12 14:36 835Condition 将 Object 监视器方法(wait、n ... -
java多线程设计wait
2013-07-12 14:30 694在Java中,这个机制的实 ... -
Monitor
2013-07-12 10:44 15341. 什么是Monitor? Monitor其实是一 ... -
处理 子线程的返回值
2013-07-08 14:19 860package com.jimmy.Thread.Conc ... -
ExecutorService的execute和submit方法
2013-07-05 17:21 1033因为之前一直是用的exec ... -
Exchanger-兄弟线程的信息交换
2013-07-05 16:23 697如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使 ... -
lockInterruptibly 和lock的区别
2013-06-26 16:36 886lockInterruptibly 与 lock比较区别在于 ... -
慎重使用volatile关键字
2013-06-26 11:10 743volatile关键字相信了解Java多线程的读者都很清楚它的 ... -
对synchronized(this)的一些理解
2013-06-26 10:18 674一、当两个并发线程访问同一个对象object中的这个synch ... -
java中的lock和synchronized区别
2013-06-26 10:02 5901、ReentrantLock 拥有Synchronized相 ... -
线程sleep,join,yield的区别
2013-06-21 17:37 5141.sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
初学Java多线程:慎重使用volatile关键字
2013-02-25 15:18 694学习Java多线程中会遇到使用volatile关键字的情况。v ... -
java之yield(),sleep(),wait()区别详解-备忘笔记
2013-02-25 14:32 6331、sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
Java Thread join() 的用法
2013-02-25 13:24 587Java Thread中, join() 方法主要是让调用改方 ...
相关推荐
总之,Java线程群组是管理和控制多线程的重要工具,它可以帮助我们更好地组织代码,提高并发程序的可读性、可维护性和安全性。实例63将具体展示如何在实践中运用这些概念。通过深入理解并运用线程群组,我们可以编写...
- `threadFactory(ThreadGroup group, ThreadFactory threadFactory)`:创建一个定制的线程工厂,可以自定义线程组和线程工厂。 4. **Callable任务的转换** - `callable(Runnable task)`:将Runnable转换为...
ThreadGroup 类,可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式。但是,不推荐使用,因为使用有很多的安全隐患。 7. Executor ...
除了基本的线程操作外,Java还提供了许多高级的API来帮助开发者更好地管理和控制线程。 **线程中断:** - **中断状态**:线程可以通过`interrupt()`方法设置中断标志。 - **检测中断**:通过`isInterrupted()`方法...
这个简单的线程池实现展示了线程池的基本概念,但实际生产环境中,Java 提供了更为强大的 `java.util.concurrent.ExecutorService` 和 `java.util.concurrent.ThreadPoolExecutor` 类,它们提供了更多的功能和更好的...
相比之下,使用线程池(如`ExecutorService`)更加安全和高效,可以更好地管理和控制线程资源。 7. **Executor框架**:Executor框架提供了一种更高级的线程管理方式,通过`ExecutorService`接口和`...
### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** ...通过学习上述各个方面,我们可以更好地理解和利用Java的并发机制,从而开发出更高效、更稳定的多线程应用程序。
- 学习Java的线程模型,如JVM如何调度线程,可以阅读JDK源码中`java.lang.Thread`和`java.lang.ThreadGroup`的相关实现。 - 分析`synchronized`和`volatile`的底层实现,了解内存模型(Java Memory Model)对并发...
为了更好地理解Vert.x的线程模型,我们首先需要了解几个核心概念: - **Vertx对象**:它是控制整个Vert.x应用的核心。通过Vertx对象,开发者可以执行一系列操作,比如创建TCP/HTTP客户端与服务器、操作Event Bus、...
操作系统是计算机系统的核心组成部分,它负责管理和控制硬件资源,为应用程序...通过编写和调试代码,可以更好地掌握操作系统的复杂性和设计原则,这对于任何想要深入计算机系统底层的程序员来说都是宝贵的实践机会。
### Java多线程自学笔记知识点总结 #### 一、Java多线程概念 - **多线程定义**:多线程是指程序中可以同时执行多个线程的能力。Java虚拟机支持多线程...希望这份笔记能够帮助读者更好地理解Java多线程的相关知识。
这个文档以中文呈现,旨在帮助那些英语阅读能力有限或更喜欢中文阅读的开发者更好地理解和使用 Java 语言。 Java API(应用程序接口)是 Java 平台的核心组成部分,提供了大量预先定义的类和方法,用于实现各种功能...
线程组(ThreadGroup)是用来管理一组线程的容器,它自身也是线程。线程组可以包含子线程组,形成一个树形结构。线程组提供了线程的统计、监控和保护等功能,例如,可以一次性停止组内所有线程。 在实际编程中,...
### Java并发编程面试题知识点详解 #### 1. 在 Java 中守护线程和本地线程的区别?...以上是《Java并发编程面试题合集》中涉及的一些核心知识点的详细解释,希望能帮助准备面试的朋友更好地理解这些概念。
本篇文章将深入探讨Java线程的源码,以帮助你更好地理解其工作原理。 首先,让我们来看看`Thread`类。`Thread`是Java并发编程的基础,位于`java.lang`包中。每个Java应用程序至少有一个线程,即主线程。当你创建一...
【Java面试总结】 ...同时,保持学习的动力,记录每天的学习进度,可以帮助你更好地坚持下去。在投递简历时,根据自己的经验和目标公司,选择合适的方式,积累面试经验,以便在面试中展现出最佳状态。
通过将两者结合使用,可以更好地管理定时任务,并充分利用 Spring 的特性。 #### 二、Spring与Quartz的整合概述 整合 Spring 和 Quartz 可以让开发者更加灵活地管理和控制定时任务。以下是整合的基本步骤: 1. **...
考虑到异步读取和订阅可能涉及多线程操作,了解Java的并发编程概念和工具(如Thread、Runnable、ExecutorService、synchronized关键字等)至关重要,以确保程序的稳定性和性能。 8. **OPC UA支持** 虽然原始的OPC...
这种结构使得P2P网络具有更好的扩展性和容错性。 **2. 获得网络中可以通信端点的IP和端口** 为了实现节点间的直接通信,需要解决如何获取对方的IP地址和端口信息的问题。一种常用的方法是利用多播技术。多播技术...
【第3章 高级查询(一)】在这个章节,学员将更深入地探索SQL查询技术,学习子查询、联接(JOIN)的多种类型(如内连接、外连接、自连接),以及聚合函数(如SUM, AVG, COUNT, MAX, MIN)和分组(GROUP BY)操作。...