您的位置:首页 > 其它

010-ThreadGroup线程组

2017-09-28 22:59 417 查看
  线程组ThreadGroup表示一组线程的集合,一旦一个线程归属到一个线程组之中后,就不能再更换其所在的线程组。那么为什么要使用线程组呢?个人认为有以下的好处:方便统一管理,线程组可以进行复制,快速定位到一个线程,统一进行异常设置等。ThreadGroup它其实并不属于Java并发包中的内容,它是java.lang中的内容。但是掌握对其的于理解,在实际应用中有很大的帮助。

一、基本方法

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,都可以对线程进行控制---包括休眠,唤醒,结束,创建,中断(暂停)--但并不一定包含全部这些操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: