java 线程组作用_Java线程组(ThreadGroup)使用

JDK 对线程组类注释:

A thread group represents a set of threads. In addition, a thread group can also include other thread groups. The thread groups form a tree in which every thread group except the initial thread group has a parent.

A thread is allowed to access information about its own thread group, but not to access information about its thread group's parent thread group or any other thread groups.

可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示.

线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织

c074268e4bf3dc498a31cd49994a9c7e.png

1.线程组示例:

展示线程组结构代码实例如下:

/**

* 类功能描述:

*

* @author WangXueXing create at 18-12-27 下午3:25

* @version 1.0.0

*/

public class ThreadGroupTest implements Runnable {

@Override

public void run() {

try {

while (!Thread.currentThread().isInterrupted()) {

Thread currentThread = Thread.currentThread();

System.out.println("current thread:" + currentThread.getName()

+" thread group:"+currentThread.getThreadGroup().getName()

+" parent thread group:"+currentThread.getThreadGroup().getParent().getName());

Thread.sleep(3000);

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

ThreadGroup rootThreadGroup = new ThreadGroup("root线程组1");

Thread t0 = new Thread(rootThreadGroup, new ThreadGroupTest(), "Thread 0");

t0.start();

ThreadGroup tg = new ThreadGroup(rootThreadGroup,"线程组1");

ThreadGroup tg2 = new ThreadGroup(rootThreadGroup,"线程组2");

Thread t1 = new Thread(tg, new ThreadGroupTest(), "Thread 1");

Thread t2 = new Thread(tg, new ThreadGroupTest(), "Thread 2");

t1.start();

t2.start();

Thread t3 = new Thread(tg2, new ThreadGroupTest(), "Thread 3");

Thread t4 = new Thread(tg2, new ThreadGroupTest(), "Thread 4");

t3.start();

t4.start();

}

}

打印结果如下:

current thread:Thread 0 thread group:root线程组1 parent thread group:main

current thread:Thread 2 thread group:线程组1 parent thread group:root线程组1

current thread:Thread 1 thread group:线程组1 parent thread group:root线程组1

current thread:Thread 3 thread group:线程组2 parent thread group:root线程组1

current thread:Thread 4 thread group:线程组2 parent thread group:root线程组1

current thread:Thread 1 thread group:线程组1 parent thread group:root线程组1

current thread:Thread 0 thread group:root线程组1 parent thread group:main

current thread:Thread 2 thread group:线程组1 parent thread group:root线程组1

current thread:Thread 3 thread group:线程组2 parent thread group:root线程组1

......

2.线程组项目中应用(线程组内的线程异常统一管理):

最近有个需求,生成复杂报表-从很多表数据中分析统计到一个报表。

实现思路:

多个线程分别到不同表中查数据并统计分析,任何一个线程失败整体报表生成失败,记录日志并立即中断其他线程。全部线程成功,报表生成成功。

废话少说以下利用Java线程组结合CountDownLatch实现代码如下:

/**

* 多线程获取报表数据

* @param reportId 报表ID

* @return

*/

def getReportData(reportId: Long, supplierDetailMap: ConcurrentHashMap[Integer, Supplier]):

ConcurrentHashMap[Integer, AnyRef] = {

val dataMap = new ConcurrentHashMap[Integer, AnyRef]()

//多线程同步器

val conutDownLatch = new CountDownLatch(3)

//实例化线程组

val genThreadGroup = new GenThreadGroup(request.reportInfo.reportType.name, reportId)

//获取当月已开返利

new Thread(genThreadGroup, new Runnable {

override def run(): Unit = {

dataMap.put(OPENED_REBATE_CODE, SupplierAccountDetailQuerySql.getTaxDiscountByMonth(request))

conutDownLatch.countDown()

}

}, "获取当月已开返利").start()

//获取当月累计解押款

new Thread(genThreadGroup, new Runnable {

override def run(): Unit = {

dataMap.put(DEPOSIT_BY_MONTH, SupplierAccountDetailQuerySql.getDepositAmountByMonth(request))

conutDownLatch.countDown()

}

}, "获取当月累计解押款").start()

//结算单的含税金额

new Thread(genThreadGroup, new Runnable {

override def run(): Unit = {

dataMap.put(ACCOUNT_PAYABLE_AMOUNT, SupplierAccountDetailQuerySql.getAccountPayableAmount(request))

conutDownLatch.countDown()

}

}, "获取结算单的含税金额").start()

//所有线程都执行完成

conutDownLatch.await()

dataMap

}

统一捕获异常的线程组定义如下:

/**

* 定义报表生成线程组

*

* @author BarryWang create at 2018/5/21 11:04

* @version 0.0.1

*/

class GenThreadGroup(groupName: String, reportId: Long) extends ThreadGroup(groupName){

val logger: Logger = LoggerFactory.getLogger(classOf[GenThreadGroup])

/**

* 定义线程组中任意一个线程异常处理

* @param thread 当前线程

* @param exception 异常

*/

override def uncaughtException(thread: Thread, exception: Throwable): Unit = {

logger.error(s"报表(ID:${reportId})生成异常, 线程组:${groupName}; 线程:${thread.getName} 失败", exception)

thread.getThreadGroup.interrupt()

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web.xml.jsf_JSF 2.2在30秒内创建一个自定义Hello World组件

web.xml.jsf让我们直接跳到很酷的东西上,说在JSF 2.0中,通过在Facelet标记库( *taglib.xml )中对其进行配置,使页面作者可以使用自定义组件。 此外,当将组件映射到JAR中时,需要在web.xml一个特殊…

java左上角图标太小_Eclipse在高分屏下图标过小的解决方法

自己败了一台Surface Pro 4,打算用来看PDF、练代码。安装了Eclipse并且打开之后,发现图标显示极其细小,肉眼几乎无法看清了。这是由于Eclipse对高分屏没有作适配导致的。Windows 10本身对于高分屏的支持已是相当不错,苏菲4的屏幕分…

java胜任理由_Java在几乎所有方面均能胜任本机响应

java胜任理由我与一位同事讨论了Java与JavaScript的话题,这是一个有问题的话题。 然后他提到React Native多么出色,我决定我必须研究一下,也许要为Codename One掌握一些想法…… 那里有一些不错的主意,但是它们都不是革命性的或例…

java发送文件_java 模拟http发送文件和参数

一、maven:org.apache.httpcomponentshttpmime4.5.3二、工具类:import java.io.File;import java.util.Map;import java.util.Map.Entry;import org.apache.http.*;import org.apache.http.client.HttpClient;import org.apache.http.client.config.Requ…

设置Elasticsearch N-Gram字分析器的过程

说n-gram是一个大话题,这是轻描淡写的。 进行快速搜索,您会发现自己盯着语言学和语言模型,数据挖掘或特定蛋白质的分解对首次亮相文化的衰落所隐含的信息量。 好吧,我在跟那最后一个开玩笑。 但是,如果您是开发人员&a…

java字节码反编译_javap 反编译 java 字节码文件

概述:javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。语法:把java文件编译为class文件:javac Test.java (Test.java为java文件名) 生成对…

javaone_JavaOne演讲者选择了您不容错过的10个会话

javaone确保会议安排中包含这些JavaOne会话 JavaOne 2015从这个星期日开始,数百个会话同时进行,因此很难筛选所有会话并选择要参加的会话。 这就是为什么我们邀请5位最喜欢的JavaOne发言人让我们了解他们的会议,并选择他们最期待的会议。 好…

java servlet文件下载_Java之Servlet文件下载20190228

jsp页面:pageEncoding"utf-8"%>Insert title here下载index.jsp下载1.jpg下载test.jspServlet:packageorg.jimmy.testwebproject2019012602.servlet.download;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjavax.se…

activiti 多租户_Activiti中具有独立数据库架构的多租户

activiti 多租户我们过去听到的一项功能请求是以多租户方式运行Activiti引擎,使租户的数据与其他数据隔离。 当然,在某些云/ SaaS环境中,这是必须的。 几个月前,波恩大学的学生拉斐尔吉伦(Raphael Gielen)…

jigsaw kaggle_使用Project Jigsaw的JDK 9 Early Access上的Eclipse IDE

jigsaw kaggle几周前,我写了关于在Java 9上运行Eclipse Neon的文章 (尽管,我在帖子标题中错误地且令人尴尬地留下了“火星”)。 值得注意的是,我列出的步骤也适用于带有Project Jigsaw (Java模块化&#xf…

win7 activemq_带有骆驼,ActiveMQ,Elasticsearch的关键HL7用例

win7 activemqML7上的HL7是可以说HL7协议格式的系统的一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台,在为关键医疗保健提供者构建灵活,有弹性,高可用性的集成方案方面拥有良好的经验。 此外,在JCAPS上替…

jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7

jboss4 迁移几周前,我发布了一个有关从Java EE 5迁移到7的博客 。这主要是关于如何使用新的Java EE 7改进Java EE 5代码。 现在,在这篇文章中,我将对应用程序服务器端的迁移路径进行一些研究。 如果您使用的是Java EE 5,则很有可…

java xmlrpc2.0 实现_简单的java xmlrpc

简单的 XMLRPCjava---XmlRpcClientpackage com.company;import org.apache.xmlrpc.XmlRpcClient;import org.apache.xmlrpc.XmlRpcException;import java.net.MalformedURLException;import java.util.Hashtable;import java.util.Vector;public class…

操作方法:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf,并且需要在视图中格式化Java 8 Date&Time对象,则可以使用thymeleaf-extras-java8time –用于Java 8 Date&Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

java boundary_上传文件multipart form-data boundary 说明

含义 ENCTYPE"multipart/form-data" 说明:通过 http 协议上传文件 rfc1867协议概述,客户端发送内容构造。概述在最初的 http 协议中,没有上传文件方面的功能。 rfc1867为 http 协议添加了这个功能。客户端的浏览器,如 M…

java 预处理语句_预处理语句PreparedStatement到底咋用啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己试了一下直接查询id为1的语句,有一条结果出来,但是用了PreparedStatement后就没有结果了,有大佬知道为什么吗orzpackage test;import java.io.IOException;import java.io.PrintWriter;imp…

crud-table_我个人的CRUD故事-或我如何来到CUBA平台

crud-table在此博客文章中,我想介绍一下我如何使用CUBA平台以及该工具的好处。 在我年轻的“业务应用程序开发”历史上,我将深入探讨各个阶段,只是给您一些背景知识。 因此,让我们从如何进入典型的CRUD应用程序开始,以…

python api接口生成_Django 自动生成api接口文档教程

最近在写测试平台,需要实现一个节点服务器的api,正好在用django,准备使用djangorestframework插件实现。需求实现一个接口,在调用时,通过传递的参数,直接运行对应项目的自动化测试环境Python3.6 ,PyCharm,W7项目结构功…

eclipse clean_Clean Sheet – Windows 10的人体工程学Eclipse主题

eclipse cleanClean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净,低眩光的外观和感觉,旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择,可以突出谐波语法并注重可读性。 除自定义滚动条外,它还努力满…

什么时候需要使用cqrs_在CQRS读取模型中使用Hibernate进行快速开发

什么时候需要使用cqrs在本文中,我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要Hibernate? Hibernate非常流行。 从外观上看,它也很容易,而从内部看,它却相当复杂。 它可以很容易地上手…