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,一经查实,立即删除!

相关文章

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

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

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上替…

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

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

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非常流行。 从外观上看,它也很容易,而从内部看,它却相当复杂。 它可以很容易地上手…

java 隐藏了什么_JAVA程序中封装与隐藏是什么意思

qq_遁去的一_1隐藏就是封装吧。。。。封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一…

esb 和 开源esb_如果今天完成,ESB会是什么样子?

esb 和 开源esbJavaOne 2015即将结束,这又是一次很棒的社区活动。 我和Rafael进行了两次会议和一次HOL 。 我最喜欢的会议之一实际上是:谈论ESB,如果今天完成的话。 我以为那是过去? 我通常也倾向于这样说。 但是,系统…

五皇后问题 java_Java的5个古怪问题

五皇后问题 java我们有机会接触到一些最奇怪的Java难题 即使是最有经验的Java开发人员,也会在这篇文章中发现令人困惑的问题。 或者至少是有趣的(绝对不公平)。 在经历了Java Deathmatch冒险之后,我们决定这次发布一系列不同的问…

java加密成固定长度_Java使用MD5加密,生成的密文长度只有31位

在使用MD5加密时,生成的密文长度只有31位,该怎么解决?代码如下:public static String toMd5(String str) {String re null;byte encrypt[];try {byte[] tem str.getBytes();MessageDigest md5 MessageDigest.getInstance("…

可以自定义模板的ide_将IDE检查应用于自定义Java批注

可以自定义模板的ideJ2SE 5中注释的引入改变了我们编写和处理Java的方式。 除了Java SE的预定义注释外 ,框架,IDE和工具包还引入了自己的自定义注释 。 Checker框架提供了一些示例,说明如何使用自定义批注在Java中增加类型安全性 。 在本文中…

java设置弹出框为模态_点击按钮弹出模态框的一系列操作代码实例

实现功能提交按钮功能:点击提交按钮的时候都会弹出模态框,但是有不同的状态:审核状态未通过:弹出未通过理由的input输入框,模态框中除了取消和确定按钮,新增确定并保存医院的按钮审核状态已通过&#xff1a…

java中bpmn流程图_Java学习之BPMN知识以及Activiti的流程部署

BPMN的介绍Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。那什么是BP…

javaone_JavaOne 2015 –第二十版十大收获

javaone我们刚刚在旧金山有了JavaOne的第二十版。 这将是我自2004年以来第十二次参加不间断的系列活动。最大的教训是什么,可以揭示Java的未来。 模块化斗争 自从Java 2007首次提到模块以来,已经花费了将近9年的时间,或者说,直到…

java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

Java项目中调用bat批处理配合使用BCP进行多用户数据的备份一、项目需求最近项目中需要对数据库(Sql Server系列数据库)进行备份。项目中的需求不是简单的整个数据库的备份,而是根据用户来备份,具体的备份策略如下:①系统为某一赛事管理类型的…

mycat和应用程序集成_企业应用程序集成简介

mycat和应用程序集成本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转…

activemq和jms_带有ActiveMQ和Maven的JMS Sender应用程序

activemq和jms我们已经看到了如何使用ActiveMQ和Maven创建JMS Receiver应用程序 。 让我们看看我们如何类似地创建JMS Sender应用程序 。 web.xml与创建接收器应用程序时使用的相同&#xff1a; <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi&qu…