`
- 浏览:
12922003 次
- 性别:
- 来自:
大连
-
ThreadGroup线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。<wbr style="line-height:25px"><br style="line-height:25px"><wbr style="line-height:25px"><span style="color:#003366; line-height:25px">线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。</span><br style="line-height:25px"><span style="color:#003366; line-height:25px">允许线程访问有关自己的线程组的信息,但是不允许它访问有关其线程组的父线程组或其他任何线程组的信息</span><wbr style="line-height:25px"><span style="color:#003366; line-height:25px">。</span><br style="line-height:25px">
构造方法<br style="line-height:25px"><wbr style="line-height:25px"><span style="color:#993300; line-height:25px">public</span><span style="color:#ff6600; line-height:25px">ThreadGroup(Stringname)</span><wbr style="line-height:25px"><br style="line-height:25px">
构造一个新线程组。新线程组的父线程组是目前正在运行线程的线程组。<br style="line-height:25px">
不使用任何参数调用父线程组的checkAccess方法;这可能导致一个安全性异常。<br style="line-height:25px">
参数:<br style="line-height:25px">
name-新线程组的名称。<br style="line-height:25px">
抛出:<br style="line-height:25px">
SecurityException-如果当前线程不能在指定的线程组中创建线程。<br style="line-height:25px"><wbr style="line-height:25px"><span style="color:#993300; line-height:25px">public</span><span style="color:#ff6600; line-height:25px">ThreadGroup(ThreadGroupparent,Stringname)</span><wbr style="line-height:25px"><br style="line-height:25px">
创建一个新线程组。新线程组的父线程组是指定的线程组。<br style="line-height:25px">
不使用任何参数调用父线程组的checkAccess方法;这可能导致一个安全性异常。<br style="line-height:25px">
参数:<br style="line-height:25px">
parent-父线程组。<br style="line-height:25px">
name-新线程组的名称。<br style="line-height:25px">
抛出:<br style="line-height:25px">
NullPointerException-如果线程组参数为null。<br style="line-height:25px">
SecurityException-如果当前线程不能在指定的线程组中创建线程。<br style="line-height:25px"><span style="line-height:25px"><wbr style="line-height:25px"></wbr></span><span style="color:#003366; line-height:25px">在Java中每个线程都属于某个线程组(ThreadGroup)。</span><br style="line-height:25px"><span style="color:#000080; line-height:25px">例如,如果在main()中产生一个线程,则这个线程属于main线程组(其名字为"main")管理的一员</span><wbr style="line-height:25px">,您可以使用下面的指令来获得目前线程所属的线程组名称:<br style="line-height:25px"><span style="color:#0000ff; line-height:25px">Thread.currentThread().getThreadGroup().getName();</span><br style="line-height:25px"><span style="color:#000080; line-height:25px">每一个线程产生时,都会被归入某个线程组,视线程是在哪个线程组中产生而定。如果没有指定,则归入产生该子线程的线程的线程组中。<br style="line-height:25px">
您也可以自行指定线程组,线程一旦归入某个组,就无法更换组</span>。<br style="line-height:25px">
java.lang.ThreadGroup类正如其名,可以统一管理整个线程组中的线程,您可以使用以下方式来产生线程组,而且一并指定其线程组:<br style="line-height:25px"><span style="color:#3366ff; line-height:25px">ThreadGroupthreadGroup1=newThreadGroup("group1");<br style="line-height:25px">
ThreadGroupthreadGroup2=newThreadGroup("group2");<br style="line-height:25px">
Threadthread1=newThread(threadGroup1,"group1'smember");<br style="line-height:25px">
Threadthread2=newThread(threadGroup2,"group2'smember");</span><br style="line-height:25px"><span style="color:#ff00ff; line-height:25px">ThreadGroup</span><span style="color:#003366; line-height:25px">中的某些方法,可以对所有的线程产生作用,例如interrupt()方法可以interrupt线程组中所有的线程,</span><br style="line-height:25px"><span style="color:#ff6600; line-height:25px">setMaxPriority()</span><span style="color:#003366; line-height:25px">方法可以设置线程组中线程所能拥有的最高优先权(本来就拥有更高优先权的线程不受影响)。<br style="line-height:25px">
如果您想要一次获得线程组中所有的线程来进行某种操作,可以使用enumerate()方法,</span>例如:<br style="line-height:25px"><span style="color:#3366ff; line-height:25px">Thread[]threads=newThread[threadGroup1.activeCount()];<br style="line-height:25px">
threadGroup1.enumerate(threads);</span><br style="line-height:25px">
activeCount()方法获得线程组中正在运行的线程数量,enumerate()方法要传入一个Thread数组,<br style="line-height:25px">
它将线程对象设置到每个数组字段中,然后就可以通过数组索引来操作这些线程。<br style="line-height:25px"><span style="color:#ff00ff; line-height:25px">ThreadGroup</span>中有一个<span style="color:#ff6600; line-height:25px">uncaughtException()</span>方法。当线程组中某个线程发生Uncheckedexception异常时,<br style="line-height:25px">
由执行环境调用此方法进行相关处理,如果有必要,您可以重新定义此方法,直接使用范例15.9来示范如何实现。<br style="line-height:25px"><span style="line-height:25px"><wbr style="line-height:25px">范例1</wbr></span>
<div style="line-height:25px">ThreadGroupDemo.java文件<br style="line-height:25px"><span style="color:#3366ff; line-height:25px">packageonlyfun.caterpillar;<br style="line-height:25px">
importjava.io.*;<br style="line-height:25px"></span><span style="color:#993300; line-height:25px">publicclass</span><span style="color:#3366ff; line-height:25px"></span><span style="color:#ff6600; line-height:25px">ThreadGroupDemo</span><span style="color:#3366ff; line-height:25px">{<br style="line-height:25px"></span><span style="color:#993300; line-height:25px">publicstaticvoid</span><span style="color:#3366ff; line-height:25px"></span><span style="color:#ff6600; line-height:25px">main</span><span style="color:#3366ff; line-height:25px">(String[]args){<br style="line-height:25px">
ThreadGroupthreadGroup1=<br style="line-height:25px"></span><span style="color:#808080; line-height:25px">//这是匿名类写法</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">newThreadGroup("group1"){</span><br style="line-height:25px"><span style="color:#808080; line-height:25px">//继承ThreadGroup并重新定义以下方法<br style="line-height:25px">
//在线程成员抛出uncheckedexception<br style="line-height:25px">
//会执行此方法</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">publicvoiduncaughtException(Threadt,Throwablee){</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">System.out.println(t.getName()+":"</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">+e.getMessage());</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">};</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#808080; line-height:25px">//这是匿名类写法</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">Threadthread1=</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#808080; line-height:25px">//这个线程是threadGroup1的一员</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">newThread(threadGroup1,</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">newRunnable(){</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">publicvoidrun(){</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#808080; line-height:25px">//抛出unchecked异常</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">thrownewRuntimeException("测试异常");</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">});</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">thread1.start();</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span>在<span style="color:#0000ff; line-height:25px">uncaughtException()</span>方法的参数中,第一个参数可以获得发生异常的线程实例,而第二个参数可以获得异常对象,<br style="line-height:25px">
范例中显示了线程的名称及异常信息,结果如下所示:<br style="line-height:25px"><span style="color:#3366ff; line-height:25px">Thread-0:测试异常</span><br style="line-height:25px">
在J2SE5.0之前,如果要统一处理某些线程的UncheckedException,可以使用ThreadGroup来管理。<br style="line-height:25px">
在继承ThreadGroup之后重新定义其uncaughtException()方法,就如范例1所示。在J2SE5.0之后,就不用这么麻烦,<br style="line-height:25px">
可以让异常处理类使用Thread.UncaughtExceptionHandler接口,并实现其uncaughtException()方法,<br style="line-height:25px">
例如可以改写范例1,首先定义一个类让其实现Thread.UncaughtExceptionHandler接口。<br style="line-height:25px">
范例2</div>
<div style="line-height:25px">ThreadExceptionHandler.java文件<br style="line-height:25px"><span style="color:#3366ff; line-height:25px">packageonlyfun.caterpillar;</span><br style="line-height:25px"><span style="color:#993300; line-height:25px">publicclass</span><span style="color:#3366ff; line-height:25px"></span><span style="color:#ff6600; line-height:25px">ThreadExceptionHandler</span><br style="line-height:25px"><span style="color:#993300; line-height:25px">implements</span><span style="color:#3366ff; line-height:25px">Thread.UncaughtExceptionHandler{</span><br style="line-height:25px"><span style="color:#993300; line-height:25px">publicvoid</span><span style="color:#3366ff; line-height:25px">uncaughtException(Threadt,Throwablee){</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">System.out.println(t.getName()+":"</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">+e.getMessage());</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px">
接着范例1主流程可以改写为范例3。<br style="line-height:25px"><span style="line-height:25px"><wbr style="line-height:25px">范例3</wbr></span>ThreadGroupDemo2.java<br style="line-height:25px"><span style="color:#3366ff; line-height:25px">packageonlyfun.caterpillar;<br style="line-height:25px">
importjava.io.*;<br style="line-height:25px"></span><span style="color:#993300; line-height:25px">publicclass</span><span style="color:#3366ff; line-height:25px"></span><span style="color:#ff6600; line-height:25px">ThreadGroupDemo2</span><span style="color:#3366ff; line-height:25px">{<br style="line-height:25px"></span><span style="color:#993300; line-height:25px">publicstaticvoid</span><span style="color:#3366ff; line-height:25px"></span><span style="color:#ff6600; line-height:25px">main</span><span style="color:#3366ff; line-height:25px">(String[]args){<br style="line-height:25px"></span><span style="color:#808080; line-height:25px">//建立异常处理者</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">ThreadExceptionHandlerhandler=</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">newThreadExceptionHandler();</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">ThreadGroupthreadGroup1=newThreadGroup("group1");</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#808080; line-height:25px">//这是匿名类写法</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">Threadthread1=</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#808080; line-height:25px">//这个线程是threadGroup1的一员</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">newThread(threadGroup1,</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">newRunnable(){</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">publicvoidrun(){</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#808080; line-height:25px">//抛出unchecked异常</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">thrownewRuntimeException("测试异常");</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">});</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#808080; line-height:25px">//设置异常处理者</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px"></span><span style="color:#0000ff; line-height:25px">thread1.setUncaughtExceptionHandler(handler);</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">thread1.start();</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px"><span style="color:#3366ff; line-height:25px">}</span><br style="line-height:25px">
需要注意的函数:<br style="line-height:25px">
publicfinalvoidcheckAccess()<br style="line-height:25px">
确定当前运行的线程是否有权修改此线程组。<br style="line-height:25px">
如果有安全管理器,则用此线程组作为其参数调用checkAccess方法。结果可能是抛出一个SecurityException。<br style="line-height:25px">
抛出:<br style="line-height:25px">
SecurityException-如果不允许当前线程访问此线程组。<br style="line-height:25px"><span style="line-height:25px"><wbr style="line-height:25px">注意</wbr></span><wbr style="line-height:25px">:<span style="color:#000080; line-height:25px">它返回的居然是</span><span style="color:#0000ff; line-height:25px">void</span><span style="color:#000080; line-height:25px">,而不是</span><span style="color:#0000ff; line-height:25px">boolean</span><span style="color:#000080; line-height:25px">.其实如果当前运行的线程没有权修改此线程组,则抛出一个</span><span style="color:#ff9900; line-height:25px">SecurityException</span><span style="color:#000080; line-height:25px">。<br style="line-height:25px">
否则不抛出</span>。<br style="line-height:25px"><wbr style="line-height:25px"><span style="color:#993300; line-height:25px">publicint</span><span style="color:#ff6600; line-height:25px">enumerate(Thread[]list)</span><wbr style="line-height:25px"><br style="line-height:25px">
把此线程组及其子组中的所有活动线程复制到指定数组中。<br style="line-height:25px">
首先,不使用任何参数调用此线程组的checkAccess方法;这可能导致一个安全性异常。<br style="line-height:25px">
应用程序可以使用activeCount方法获取数组大小的估计数,但是,如果数组太小而无法保持所有线程,则忽略额外的线程。如果获得此线程组及其子组中的所有活动线程非常重要,则调用方应该验证返回的int值是否严格小于list的长度。<br style="line-height:25px">
由于使用此方法所固有的竞争条件,建议只将此方法用于信息目的。<br style="line-height:25px">
参数:<br style="line-height:25px">
list-放置线程列表的数组。<br style="line-height:25px">
返回:<br style="line-height:25px">
放入数组中的线程数。<br style="line-height:25px">
抛出:<br style="line-height:25px">
SecurityException-如果不允许当前线程枚举此线程组。<br style="line-height:25px"><span style="line-height:25px"><wbr style="line-height:25px">注意</wbr></span><wbr style="line-height:25px">:<wbr style="line-height:25px"><span style="color:#000080; line-height:25px">它的目的是把子组中的所有活动线程复制到指定数组list中。还有一些enumerate的函数,具体参考文档</span><wbr style="line-height:25px">。<br style="line-height:25px">
publicfinalvoidinterrupt()<br style="line-height:25px">
中断此线程组中的所有线程。<br style="line-height:25px">
首先,不使用任何参数调用此线程组的checkAccess方法;这可能导致一个安全性异常。<br style="line-height:25px">
然后,此方法将对此线程组及其所有子组中的所有线程调用interrupt方法。<br style="line-height:25px">
抛出:<br style="line-height:25px">
SecurityException-如果不允许当前线程访问此线程组或线程组中的任何线程<br style="line-height:25px"><span style="line-height:25px"><wbr style="line-height:25px">注意:</wbr></span><span style="color:#000080; line-height:25px">线程组的目的就是对线程进行管理。interrupt()是其中的一个接口</span><wbr style="line-height:25px">。</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
</div>
</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
线程组:ThreadGroup, 一个线程组可以有多个线程,也可以有很多子线程组 二、线程池:系统每产一个线程要占用较多时间,所以我们可以用线程池,在池中预放n个线程,用时取出,不用时可以还回去。
主要介绍了Java线程组操作,结合实例形式分析了ThreadGroup类创建与使用线程组相关操作技巧,需要的朋友可以参考下
主要介绍了Java并发编程示例(十):线程组,Java提供了ThreadGroup类来控制一个线程组,一个线程组可以通过线程对象来创建,也可以由其他线程组来创建,生成一个树形结构的线程,需要的朋友可以参考下
多线程基本概念 创建线程的方式 线程的生命周期及控制 线程的优先级及调度 多线程的互斥与同步 守护线程 (Daemon) 线程组 (ThreadGroup)
本书第二版提供了对Thread和ThreadGroup类、Runnable接口和语言的同步操作符内容的全面讨论。它解释了如何在不同的平台上调度线程,如何开发CPUScheduler类来实现你自己的调度策略。其他扩展例子包括实现读/写锁、...
ThreadGroup是基于线程并发的编程语言中常用的一个概念,当一个线程派生出一个子线程后通常会加入父线程的线程组(未指定线程组的情况下)中, 最后可以通过ThreadGroup来控制一组线程的退出等操作, 然后在go语言中...
目录 线程的启动和终止 1、线程的构造 1.1继承Thread类 1.2实现Runnable接口 2、启动线程 3、线程的中断 3.1运行态的中断/阻塞态中断 ...ThreadGroup g:线程组 Runnable target:可以调用run方法的对象 String
jmeter插件相关引用请参阅:jmeter插件推荐 自定义线程组:jp@gc - Ultimate Thread Group 此线程组功能强大,可以实现多种场景设置,添加路径如图
– group 线程组 – target 执行方法 – name 线程名字 – args target执行的元组参数 – kwargs target执行的字典参数 Thread对象函数 函数 描述 start() 开始线程的执行 run() 定义线程的功能的函数(一般会...
多线程复习,欢迎大家Star 包名和内容对应如下: no1_thread_imply 线程的几种实现...no10_threadgroup 线程组 no11_thread_catch_exception 指定异常捕获类捕获线程中的异常 no12_producter_consumer_wait_no
但现在线程没有优先级,没有线程组,不能被销毁、停止、暂停、开始和打断。 Java Thread类的静态方法,被移植成了模块方法。 main thread: 运行python程序的线程 daemon thread 守护线程,如果守护线程之外的线程都...
并行作业-异步进程-线程 ... 在这里,我可以解释我如何在* NIX OS上完成此必不可少的功能。 ...这样,您的代码就可以实现这一目标。...分派单个线程(默认组) 它使用一个参数“ single_command_default_g
目前的FTP软件都是多线程的,每一个客户连接都会建立一个新的线程,而每个进程[即程序]最多大概能建立2000-4000个线程,也就是说同时最多能有2000-4000个人在线,当然要建立到那么多线程,我们家用电脑如何行通呢?...
马尔 Marl是用C ++ 11编写的混合线程/光纤任务调度程序。 关于 Marl是一个C ++ 11库,它提供了一个流畅的界面,可用于跨多个线程运行任务。...# include " marl/waitgroup.h " # include < cstdio
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...
多线程方法有助于模拟同时运行的电梯。 该模拟还利用了几种组调度算法,这些算法有助于在电梯轿厢之间分配工作量,并使电梯适应各种情况(例如,早上有更多的人-Up-Peak,每个人都将主要地板-分区)。 怎么跑 > cd ...
Win32_Thread,//系统线程 Win32_Share,//共享 Win32_NetworkClient,//已安装的网络客户端 Win32_NetworkProtocol,//已安装的网络协议 主要方法定义: // 获取Windows的“设备”名称的DataTable public static ...
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...
3.1.3 多个语句构成代码组() 3.1.4 代码组由不同的缩进分隔 3.1.5 同一行书写多个语句(;) 3.1.6 模块 3.2 变量赋值 3.2.1 赋值操作符 3.2.2 增量赋值 3.2.3 多重赋值 ...