一. java线程组特点:
1.所有用户创建的线程默认属于main线程组。main线程组是JVM在应用程序运行时自动创建。
2.如果线程A创建了线程B,创建时未指定线程组,那么线程组B自动加入线程A所在线程组。
3.线程一旦加入某个线程组,该线程就一直留着该组中,直至线程死亡,中途不可改变所属线程组。
4.用户创建的线程组默认都有一个父线程组。如线程A创建了线程组X,那么线程A所在线程组则默认称为线程组X的父线程组。
通过以下示例可验证:
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 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