4.1线程组(Thread Group)
在我们研究Thread类的时候,你可能会遇到涉及java.lang,ThreadGroup类的构造器,像Thread(ThreadGroup group,Runnable target),和方法如static int activeCount()和static int enumerate(Thread[] tarray).
JDK文档对于ThreadGroup是这样介绍的,一个线程组“代表一个线程集合。此外,一个线程组可以包含其它线程组。这个线程组从一棵树而来,每一个线程组希望初始线程组拥有一个父线程。”
运用一个ThreadGroup对象,你可以在所有包含Thread对象中实现一个操作。例如,通过变量tg,tg.suspednd()明确一个线程组的引用;在一个线程组内暂停所有线程。线程组简单地控制着许多线程。
尽管ThreadGroup显现出来是非常有用,但是你需要尽量避免这个类,有如下原因:
(1)更有用的ThreadGroup方法是void suspend()、void resum()和void stop()。这些方法不赞成使用,因为像它们的线程副本(每一个方法代表着每一个线程在线程组中),它们容易发生死锁和其它问题。
(2)ThreadGroup是线程不安全的。例如,为了在一个线程组包含着一个数量的活跃线程,你需要请求ThreadGroup的int activeCount()方法。你可能运用这个方法去定义数组的大小,这样你就可以调用ThreadGroup的其中一个方法enumerate()。然而,这样就不能保证这个计算是精确的,因为在你创建数组和调用enumerate()方法的时间之间,这个计数可能会因为其它线程的创建或暂停而改变。如果这个数组太小,enumerate()将会忽略额外的线程。与我们说的Thread的activeCount()和enumerate()的方法一样,它代表着当前线程的ThreadGroup方法。“时间查检用于时间(time of check to time of use)“类的软件Bug是一个问题例子(读者可以访问:https://en.wikipedia.org/wiki/Time_of_
check_to_time_of_use)。(这个bug也出现在糟糕脚本线程中,在应用操作一个文件之前,需要去查检文件是否存在。在查检和操作文件之间,这个文件可能被删除或创建。)
然而,你仍然需要了解ThreadGroup,因为它在线程运行期间控制其抛出异常有作用。Listing4-1的例子了解在出现run()方法内试图让除数为0的应用,而执行异常的操作,这个结果会抛出java.lang.ArithmeticException对象。
Listing4-1 从方法run()方法中抛出异常。
package com.owen.thread.chapter4;public class ExceptionThread
{public static void main(String[] args){Runnable r = new Runnable(){@Overridepublic void run(){int x = 1 / 0; // Line 10}};Thread thd = new Thread(r);thd.start();}
}
在默认主线程创建一个runnable,我们故意让整数除以0然后抛出一个ArithmeticException对象。
执行这段代码,你将会看到如下的异常:
Exception in thread "Thread-0" java.lang.ArithmeticException: / by zeroat com.owen.thread.chapter4.ExceptionThread$1.run(ExceptionThread.java:13)at java.lang.Thread.run(Thread.java:745)
当一个异常从run()方法抛出时,这个线程将会结束,并且下面的活动将会取代它:
(1)Java虚拟机(JVM)寻找一个实例的Thread。通过Thread的void setUncaughtException(Thread.UncaughtException eh)方法实例一个Thread.UncaughtExceptionHandler。当这个实例被找到之后,它将会通过执行实例的void uncaughtException(Thread t, Throwable e)方法,去抛出异常或错误——可能是一个java.lang.outOfMemoryError对象抛出;方法中的t明确Thread对象,和e明确抛出异常或错误。如果uncaughtException()抛出一个异常或错误,这个异常或错误将会被java虚拟机忽略。
(2)假设setUncaughtExceptionHandler()不会被请求给任命的操控,那么Java虚拟机(JVM)通过控制着连接ThreadGroup对象uncaughtExeption(Thread t, Throwable r)方法。假设ThreadGroup不被扩展和它的uncaughtException()方法不能继承和uncaughtException()方法不能重载去操作异常;当父级的ThreadGroup存在时。uncaughtException通过控制父级的ThreadGroup对象的uncaughtException()方法。否则,线程将会去检查是否有其它的默认不能捕抓异常出现(通过Thread的static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler)方法)。如果默认不能捕抓的异常存在,它的uncaughtException()方法将被两个相同的参数请求。否则,uncaughtException()检查它的Throwable参数去确定是否它的一个java.lang.ThreadDeath存在。如果存在,不会做什么特殊事。另外,如Listing4-1期待的信息展示,一个信息包含一个线程的名称,和一个栈的撤消,运用Throwable参数的printStackTrace()方法,它将会打印出标准的错误流。
Listing4-2证明Thread的setUncaughtExceptionHandler()和setDefaultUncaughtExceptionHandler()方法。
Listing4-2证明不能捕抓异常操作。
package com.owen.thread.chapter4;public class ExceptionThread4_2
{public static void main(String[] args){Runnable r = new Runnable(){@Overridepublic void run(){int x = 1 / 0;}};Thread thd = new Thread(r);Thread.UncaughtExceptionHandler uceh;uceh = new Thread.UncaughtExceptionHandler(){@Overridepublic void uncaughtException(Thread t, Throwable e){System.out.println("Caught throwable " + e + " for thread " + t);}};thd.setUncaughtExceptionHandler(uceh);uceh = new Thread.UncaughtExceptionHandler(){@Overridepublic void uncaughtException(Thread t, Throwable e){System.out.println("Default uncaught exception handler");System.out.println("Caught throwable " + e + " for thread " + t);}};thd.setDefaultUncaughtExceptionHandler(uceh);thd.start();}
}
执行这个代码,你将得到如下的异常:
Caught throwable java.lang.ArithmeticException: / by zero for thread Thread[Thread-0,5,main]
你不能看到默认非捕抓异常操作输出信息,因为默认操作不会被请求。为了看到默认异常输出,你必须注释掉thd.setUncaughtExceptionHandler(uche);.如果你也注释掉了thd.setDefaultUncaughtExceptionHandler(uceh);,那么你将会看Listing4-1的输出信息。
源码下载:git@github.com:owenwilliam/Thread.git
4.1线程组(Thread Group)相关推荐
- Jmeter组件-线程组(Thread Group)
Jmeter运行在JVM虚拟机上,进程的开销比较大,如果使用进程方式发起负载,随着并发量增加也需要不断增加负载机. Jmeter选择使用线程来运行, Jmeter通过线程组驱动多个线程运行测试脚本对被 ...
- jmeter模拟压测真实复杂用户场景,阶梯螺纹线程组Stepping Thread Group终极线程Ultimate Thread Group并发线程Concurrency Thread Group
我们有时需要模拟非常真实复杂的用户压测场景,可以用到此插件来设计场景 1.安装插件,选项--Plugins Manager打开安装页面 2.搜索standard set并安装,重启jmeter,查看测 ...
- 【JMeter】Thread Group下的组件Sampler取样器
我们创建了线程组Thread Group后,会在它下面add组件Sampler取样器. 1. 取样器用来向服务器发送请求,记录响应信息,响应时间的最小单元. 2. 用监听器可以查看取样结果,也可以结合 ...
- Jmeter使用教程 压力测试(1)--线程组、HTTP请求、察看结果树
线程组/Thread Group 线程数可理解为用户数. Ramp-up时间可理解为所有线程(用户)在该时间段内将请求发送完. 循环次数就是将整个线程循环发送的次数.若勾选"永远" ...
- java group类_浅析Java中线程组(ThreadGroup类)
Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...
- java线程组 线程池_JAVA多线程(三)-----线程组、线程池和线程相关类
一.线程组和未处理的异常 Thread类提供了如下几个构造器来设置新创建的线程属于哪个线程组: Thread(ThreadGroup group,Runnable target):以target的ru ...
- jmeter一个线程组多个请求_Jmeter模拟真实用户压测场景之阶梯螺纹线程组、终极线程组、并发线程组实例...
我们有时需要模拟非常真实复杂的用户压测场景,可以用到此插件来设计场景 1.安装插件,选项--Plugins Manager打开安装页面 2.搜索standard set并安装,重启jmeter,查看测 ...
- java 线程组作用_浅析Java中线程组(ThreadGroup类)
一.概念 Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线 ...
- java定时器阻塞主线程_Java基础_死锁、线程组、定时器Timer
一.死锁问题: 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 比如,线程一需要第一把所,此时锁处于空闲状态,给了 ...
- Thread Group(线程组)
线程组,可以理解用户池,用来产生线程(用户),每一个线程代表一个用户,在使用JMeter进行性能测试过程中,经常需要模拟多个用户进行测试,可以通过设置线程数代表多少个用户,通常一个线程组就代表一个测试 ...
最新文章
- linux手动释放内存的方法
- python 只取年月日 字符串_Python的数据类型
- C++ 高级数据类型(二)—— 字符序列
- php qq邮箱发送邮件报错_PHP实现发送邮件(二)
- Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
- day 61 pymysql
- android 默认分辨率是多少合适,Bluestacks分辨率修改多少合适
- 抽象代数之欧拉定理的群论的简短证明
- 对偶式与反函数_.数字逻辑.对偶式与反函数.数字逻辑下,对偶式与反函数和原函数的关系是什么?...
- 计算机主机一闪一闪的无法启动,电脑无法正常启动,启动时绿灯一闪一闪的
- 寻找发帖水王java_2.3 寻找发帖水王
- 腾讯bugly的使用,以及全局抓包配置
- CF1090H Linearization
- vue项目 - 封装loding组件
- JS随手记——跨页面传值
- Gson格式化LocalDateTime
- 2019年初面试题汇总
- 虚幻4 虚拟漫游场景 制作过程
- 面试督促自己学习进步
- openGL学习笔记三: glu库及使用