一. java线程组特点:
1.所有用户创建的线程默认属于main线程组。main线程组是JVM在应用程序运行时自动创建。
2.如果线程A创建了线程B,创建时未指定线程组,那么线程组B自动加入线程A所在线程组。
3.线程一旦加入某个线程组,该线程就一直留着该组中,直至线程死亡,中途不可改变所属线程组。
4.用户创建的线程组默认都有一个父线程组。如线程A创建了线程组X,那么线程A所在线程组则默认称为线程组X的父线程组。
通过以下示例可验证:
package net.mosang.threadgroup;
public class SignUp implements Runnable{
public SignUp(String userName, String passWord) {
this.userName = userName;
this.passWord = passWord;
System.out.println("你登录的用户名是:"+userName+"密码是:"+passWord);
if(userName.equals("创建线程组")) {
ThreadGroup tg = new ThreadGroup("newTg");
System.out.println("新线程内创建的线程组名是:"+tg.getName());
System.out.println("新线程内创建的线程组父线程组名是:"+tg.getParent().getName());
package net.mosang.threadgroup;
/**
* 线程类
* @author Heiry
* 模拟登录
*/
public class SignUp implements Runnable{
private String userName;
private String passWord;
public SignUp(String userName, String passWord) {
this.userName = userName;
this.passWord = passWord;
}
@Override
public void run() {
System.out.println("你登录的用户名是:"+userName+"密码是:"+passWord);
if(userName.equals("创建线程组")) {
ThreadGroup tg = new ThreadGroup("newTg");
System.out.println("新线程内创建的线程组名是:"+tg.getName());
System.out.println("新线程内创建的线程组父线程组名是:"+tg.getParent().getName());
}
}
}
package net.mosang.threadgroup;
/**
* 线程类
* @author Heiry
* 模拟登录
*/
public class SignUp implements Runnable{
private String userName;
private String passWord;
public SignUp(String userName, String passWord) {
this.userName = userName;
this.passWord = passWord;
}
@Override
public void run() {
System.out.println("你登录的用户名是:"+userName+"密码是:"+passWord);
if(userName.equals("创建线程组")) {
ThreadGroup tg = new ThreadGroup("newTg");
System.out.println("新线程内创建的线程组名是:"+tg.getName());
System.out.println("新线程内创建的线程组父线程组名是:"+tg.getParent().getName());
}
}
}
package net.mosang.threadgroup;
public class ThreadGroupDemo {
public static void main(String[] args) {
SignUp u1 = new SignUp("heiry", "123");
SignUp u2 = new SignUp("mosang", "456");
Thread tu1 = new Thread(u1);//创建线程
Thread tu2 = new Thread(u2);//创建线程
System.out.println(tu1.getThreadGroup().getName());//输出“main”,tu1所属线程组
System.out.println(tu2.getThreadGroup().getName());//输出“main”, tu2所属线程组
ThreadGroup g1 = new ThreadGroup("用户线程组A");//创建线组,不指定父线程组
ThreadGroup g2 = new ThreadGroup("用户线程组B");//创建线组,不指定父线程组
Thread tu3 = new Thread(g1,u1);//创建线程,指定线程组
Thread tu4 = new Thread(g2,u2);//创建线程,指定线程组
System.out.println(tu3.getThreadGroup().getName());//输出“用户线程组A”,tu3所属线程组
System.out.println(tu4.getThreadGroup().getName());//输出“用户线程组B”, tu4所属线程组
System.out.println("g1父线程组是--->"+g1.getParent().getName()); // 输出“main”
System.out.println("g2父线程组是--->"+g2.getParent().getName()); // 输出“main”
SignUp u3 = new SignUp("创建线程组", "789");//线程内将创建线程组
Thread tu5 = new Thread(g1,u3);//创建线程,指定线程组
package net.mosang.threadgroup;
/**
* 线程组示例
* @author Heiry
*
*/
public class ThreadGroupDemo {
public static void main(String[] args) {
SignUp u1 = new SignUp("heiry", "123");
SignUp u2 = new SignUp("mosang", "456");
Thread tu1 = new Thread(u1);//创建线程
Thread tu2 = new Thread(u2);//创建线程
System.out.println(tu1.getThreadGroup().getName());//输出“main”,tu1所属线程组
System.out.println(tu2.getThreadGroup().getName());//输出“main”, tu2所属线程组
ThreadGroup g1 = new ThreadGroup("用户线程组A");//创建线组,不指定父线程组
ThreadGroup g2 = new ThreadGroup("用户线程组B");//创建线组,不指定父线程组
Thread tu3 = new Thread(g1,u1);//创建线程,指定线程组
Thread tu4 = new Thread(g2,u2);//创建线程,指定线程组
System.out.println(tu3.getThreadGroup().getName());//输出“用户线程组A”,tu3所属线程组
System.out.println(tu4.getThreadGroup().getName());//输出“用户线程组B”, tu4所属线程组
System.out.println("g1父线程组是--->"+g1.getParent().getName()); // 输出“main”
System.out.println("g2父线程组是--->"+g2.getParent().getName()); // 输出“main”
SignUp u3 = new SignUp("创建线程组", "789");//线程内将创建线程组
Thread tu5 = new Thread(g1,u3);//创建线程,指定线程组
tu5.start();
}
}
package net.mosang.threadgroup;
/**
* 线程组示例
* @author Heiry
*
*/
public class ThreadGroupDemo {
public static void main(String[] args) {
SignUp u1 = new SignUp("heiry", "123");
SignUp u2 = new SignUp("mosang", "456");
Thread tu1 = new Thread(u1);//创建线程
Thread tu2 = new Thread(u2);//创建线程
System.out.println(tu1.getThreadGroup().getName());//输出“main”,tu1所属线程组
System.out.println(tu2.getThreadGroup().getName());//输出“main”, tu2所属线程组
ThreadGroup g1 = new ThreadGroup("用户线程组A");//创建线组,不指定父线程组
ThreadGroup g2 = new ThreadGroup("用户线程组B");//创建线组,不指定父线程组
Thread tu3 = new Thread(g1,u1);//创建线程,指定线程组
Thread tu4 = new Thread(g2,u2);//创建线程,指定线程组
System.out.println(tu3.getThreadGroup().getName());//输出“用户线程组A”,tu3所属线程组
System.out.println(tu4.getThreadGroup().getName());//输出“用户线程组B”, tu4所属线程组
System.out.println("g1父线程组是--->"+g1.getParent().getName()); // 输出“main”
System.out.println("g2父线程组是--->"+g2.getParent().getName()); // 输出“main”
SignUp u3 = new SignUp("创建线程组", "789");//线程内将创建线程组
Thread tu5 = new Thread(g1,u3);//创建线程,指定线程组
tu5.start();
}
}
输出结果:
main
main
用户线程组A
用户线程组B
g1父线程组是--->main
g2父线程组是--->main
你登录的用户名是:创建线程组密码是:789
新线程内创建的线程组名是:newTg
新线程内创建的线程组父线程组名是:用户线程组A
main
main
用户线程组A
用户线程组B
g1父线程组是--->main
g2父线程组是--->main
你登录的用户名是:创建线程组密码是:789
新线程内创建的线程组名是:newTg
新线程内创建的线程组父线程组名是:用户线程组A
二. 批量中止线程
中止线程组中的所有线程:void interrupt()
三. 批量设置守护线程
设置为守护线程:void setDaemon(boolean daemon)
判断是否为守护线程:boolean isDaemon()
四.其它实用方法
确定当前运行的线程是否有权修改此线程组:void checkAccess()
返回此线程组及其子组中活动组数的估计:返回此线程组中活动线程组的估计数: int activeGroupCount()
返回此线程组中活动线程的估计数: int activeCount()