1.线程组可以对多个线程进行统一管理,Java中用ThreadGroup来代表线程组,
如果没有在声明Thread时指定,那么Java默认将父线程线程组设置为当前线程的线程组。实例如下:
public class MyRunnerable1 implements Runnable {
public void run() {
System.out.println("当前线程组名:"+Thread.currentThread().getThreadGroup().getName());
System.out.println("当前线程名:"+Thread.currentThread().getName());
}
}
public class TestThreadGoup {
public static void main(String[] args) {
Thread thread1=new Thread(new MyRunnerable1());
thread1.start();
System.out.println("当前main线程组名:"+Thread.currentThread().getThreadGroup().getName());
System.out.println("当前main线程名:"+Thread.currentThread().getName());
}
}
执行结果如下
当前main线程组名:main
当前main线程名:main
当前线程组名:main
当前线程名:Thread-0
2.线程组常用的方法以及数据结构
(1).获取当前线程组名字
Thread.currentThread().getThreadGroup().getName()
(2)复制线程组(可以将线程组复制到线程数组里)
threadGroup.enumerate(array)
(3)设置线程组优先级(当线程组里线程大于线程的优先级,此时线程的优先级将会失效)
threadGroup.setMaxPriority(num);
3.守护线程
线程分为守护线程和用户线程
什么是守护线程?
所有用户线程执行完以后,守护线程也会自动退出,守护线程拥有自动结束其生命周期的特性
守护线程运用的场景?
守护线程一般用来执行后台任务,当我们希望jvm退出时,这个线程能够自动结束,此时可以选择守护线程,垃圾回收线程就是典型的守护线程。
public class MyRunnerable implements Runnable {
public void run() {
for (int i = 0; i <1000 ; i++) {
System.out.println("我是守护线程,正在执行!"+i);
}
}
}
public class MyRunnerable3 implements Runnable {
public void run() {
for (int i = 0; i <5 ; i++) {
System.out.println("我是用户线程"+i);
}
}
}
MyRunnerable myRunnerable=new MyRunnerable();
MyRunnerable3 myRunnerable3=new MyRunnerable3();
Thread thread2=new Thread(myRunnerable);
Thread thread3=new Thread(myRunnerable3);
thread2.setDaemon(true);
thread2.start();
thread3.start();
System.out.println(Thread.currentThread().getName());
执行结果
main
我是守护线程,正在执行!0
我是守护线程,正在执行!1
我是用户线程0
我是守护线程,正在执行!2
我是用户线程1
我是守护线程,正在执行!3
我是用户线程2
我是守护线程,正在执行!4
我是用户线程3
我是守护线程,正在执行!5
我是用户线程4
我是守护线程,正在执行!6
我是守护线程,正在执行!7
我是守护线程,正在执行!8
我是守护线程,正在执行!9
我是守护线程,正在执行!10
我是守护线程,正在执行!11
我是守护线程,正在执行!12
我是守护线程,正在执行!13
Process finished with exit code 0
可以看出守护线程在没执行完的情况下退出了