010-ThreadGroup线程组
2017-09-28 22:59
417 查看
线程组ThreadGroup表示一组线程的集合,一旦一个线程归属到一个线程组之中后,就不能再更换其所在的线程组。那么为什么要使用线程组呢?个人认为有以下的好处:方便统一管理,线程组可以进行复制,快速定位到一个线程,统一进行异常设置等。ThreadGroup它其实并不属于Java并发包中的内容,它是java.lang中的内容。但是掌握对其的于理解,在实际应用中有很大的帮助。
一、基本方法
1、获取当前线程组名
2、将线程放入到一个线程组中去
ThreadGroup threadGroup1 = new ThreadGroup("group1");
ThreadGroup threadGroup2 = new ThreadGroup("group2");
Thread thread1 =new Thread(threadGroup1, "group1's member");
Thread thread2 =new Thread(threadGroup2, "group2's member");
其中Thread中和ThreadGroup相关的构造函数:
View Code
4、其他方法
int activeCount():获取线程组中活动线程的数量
interrupt():中断线程组中所有线程
isDaemon():是否为后台线程组
setDaemon(boolean daemon):设置为后台线程组
setMaxPriority(int pri):设置线程组的最高优先级
四、线程池和线程组区别
线程组:
1.线程组管理线程,设置优先级,等属性,安全控制。
2.线程组必须从属于其他线程组,默认是系统主线程组。
3.将线程加入到线程组需要先创建线程组对象,将其作为线程构造函数参数。
4.List()输出线程树,enumerate()复制线程组中所有线程到一个线程数组中
线程组存在的意义,首要原因是安全。java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的。但如果在不同的线程组中,那么就不能“跨线程组”修改数据,可以从一定程度上保证数据安全。
线程池:是为了管理线程的生命周期,复用线程,减少创建销毁线程的开销。
线程池存在的意义,首要作用是效率。
线程的创建和结束都需要耗费一定的系统时间(特别是创建),不停创建和删除线程会浪费大量的时间。所以,在创建出一条线程并使其在执行完任务后不结束,而是使其进入休眠状态,在需要用时再唤醒,那么 就可以节省一定的时间。
如果这样的线程比较多,那么就可以使用线程池来进行管理。保证效率。
一般情况下,线程越多占用内存也越大,并发量也越大。
线程组和线程池共有的特点:
1,都是管理一定数量的线程
2,都可以对线程进行控制---包括休眠,唤醒,结束,创建,中断(暂停)--但并不一定包含全部这些操作。
一、基本方法
1、获取当前线程组名
Thread.currentThread().getThreadGroup().getName()
2、将线程放入到一个线程组中去
ThreadGroup threadGroup1 = new ThreadGroup("group1");
ThreadGroup threadGroup2 = new ThreadGroup("group2");
Thread thread1 =new Thread(threadGroup1, "group1's member");
Thread thread2 =new Thread(threadGroup2, "group2's member");
其中Thread中和ThreadGroup相关的构造函数:
//此线程组及其子组中的所有活动线程复制到指定数组中。 public int enumerate(ThreadGroup list[]) { checkAccess(); return enumerate(list, 0, true); } //此线程组及其子组中的所有活动线程复制到指定数组中。 public int enumerate(ThreadGroup list[], boolean recurse) { checkAccess(); return enumerate(list, 0, recurse); } //此线程组中的所有活动线程复制到指定数组中。如果 recurse 标志为 true,则还包括对此线程的子组中的所有活动线程的引用。如果数组太小而无法保持所有线程,则 // 忽略额外的线程。 private int enumerate(ThreadGroup list[], int n, boolean recurse) { int ngroupsSnapshot = 0; ThreadGroup[] groupsSnapshot = null; synchronized (this) { if (destroyed) { return 0; } int ng = ngroups; if (ng > list.length - n) {//防止list放不下线程数目 ng = list.length - n; } if (ng > 0) { System.arraycopy(groups, 0, list, n, ng);//复制线程组 n += ng; } if (recurse) { //取得其子组 ngroupsSnapshot = ngroups; if (groups != null) { groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot); } else { groupsSnapshot = null; } } } if (recurse) {//复制子组 for (int i = 0; i < ngroupsSnapshot; i++) { n = groupsSnapshot[i].enumerate(list, n, true); } } return n; }
View Code
4、其他方法
int activeCount():获取线程组中活动线程的数量
interrupt():中断线程组中所有线程
isDaemon():是否为后台线程组
setDaemon(boolean daemon):设置为后台线程组
setMaxPriority(int pri):设置线程组的最高优先级
四、线程池和线程组区别
线程组:
1.线程组管理线程,设置优先级,等属性,安全控制。
2.线程组必须从属于其他线程组,默认是系统主线程组。
3.将线程加入到线程组需要先创建线程组对象,将其作为线程构造函数参数。
4.List()输出线程树,enumerate()复制线程组中所有线程到一个线程数组中
线程组存在的意义,首要原因是安全。java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的。但如果在不同的线程组中,那么就不能“跨线程组”修改数据,可以从一定程度上保证数据安全。
线程池:是为了管理线程的生命周期,复用线程,减少创建销毁线程的开销。
线程池存在的意义,首要作用是效率。
线程的创建和结束都需要耗费一定的系统时间(特别是创建),不停创建和删除线程会浪费大量的时间。所以,在创建出一条线程并使其在执行完任务后不结束,而是使其进入休眠状态,在需要用时再唤醒,那么 就可以节省一定的时间。
如果这样的线程比较多,那么就可以使用线程池来进行管理。保证效率。
一般情况下,线程越多占用内存也越大,并发量也越大。
线程组和线程池共有的特点:
1,都是管理一定数量的线程
2,都可以对线程进行控制---包括休眠,唤醒,结束,创建,中断(暂停)--但并不一定包含全部这些操作。
相关文章推荐
- JDK中线程组ThreadGroup
- 线程组:ThreadGroup
- java --threadgroup线程组与UncaughtExceptionHandler
- ThreadGroup线程组使用
- Jmeter-Thread Group(线程组)页面说明
- 2、《Jmeter基础篇》 Thread Group(线程组)到底怎么用
- 线程类Thread的API接口分析系列之线程组ThreadGroup
- 4.1线程组(Thread Group)
- 线程组(ThreadGroup )
- java基础--27.了解线程组ThreadGroup
- 多线程 之 线程组(ThreadGroup)和线程组的中断
- 线程组ThreadGroup
- Java中的ThreadGroup线程组
- JavaSE8基础 ThreadGroup getName 获得线程所在线程组的名字
- JavaSE8基础 Thread getThreadGroup 将新建的线程加入到一个指定线程组中
- 线程组threadgroup、线程池threadpool
- 线程组ThreadGroup
- 线程组(ThreadGroup)
- 线程组ThreadGroup 4000
- 线程组ThreadGroup