守护线程
Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是:为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有了用户线程被守护这,也就没有继续运行程序的必要了。如果有非守护线程仍然存活,VM就不会退出。
即如果所有的非后台线程结束了,则后台线程也会自动终止。
守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。用户可以用Thread的setDaemon(true)方法设置当前线程为守护线程。用Thread的isDaemon()方法可以检测此线程是否为守护线程。
package com.wrh.threadInterrupt;
/*
* 设定一个守护线程
* */
public class DaemonThread extends Thread {
public DaemonThread(){
this.setDaemon(true);//设置此线程为守护线程
this.start();
}
public static void main(String[] args) {
Thread t=new DaemonThread();
System.out.println(t.isDaemon());
}
}
虽然守护线程可能非常有用,但必须小心确保其他所有非守护线程消亡时,不会由于它的终止而产生任何危害。因为你不可能知道在所有的用户线程退出运行前,守护线程是否已经完成了预期的服务任务。一旦所有的用户线程退出了,虚拟机也就退出运行了。 因此,不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。
另外有几点需要注意:
1、setDaemon(true)必须在调用线程的start()方法之前设置,否则会跑出IllegalThreadStateException异常。
2、在守护线程中产生的新线程也是守护线程。
3、 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。
线程组
在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()工作流程中产生一个线程,则产生的线程属于main这个线程组管理的一员。简单地说,线程组就是由线程组成的管理线程的类,
这个类是java.lang.ThreadGroup类。
可以通过使用如下代码获取此线程所属线程组的名称。
Thread.currentThread().getThreadGroup().getName();
Thread.currentThread():为取得当前线程。
getThreadGroup():取得当前线程所在的组。
getName():取得组的名称。
定义一个线程组,通过以下代码可以实现。
ThreadGroup group=new ThreadGroup("group");
Thread t=new Thread(group,"thread----wuranghao");
具体实例代码如下:
package com.wrh.threadInterrupt;
/*
* 设定一个守护线程
* */
public class DaemonThread extends Thread {
public DaemonThread() {
super();
this.setDaemon(true);
this.start();
}
public static void main(String[] args) {
DaemonThread t=new DaemonThread();
System.out.println(t.isDaemon());
System.out.println(Thread.currentThread().getThreadGroup().getName());
System.out.println(t.getThreadGroup().getName());
}
}
/*
结果输出:
main
main
//此种情况下说明:main线程和开启的子线程属于main线程组中。
*/
package com.wrh.threadInterrupt;
/*
* 设定一个守护线程
* */
public class DaemonThread extends Thread {
public DaemonThread(ThreadGroup group, String name) {
super(group, name);
this.setDaemon(true);
this.start();
}
public static void main(String[] args) {
ThreadGroup group=new ThreadGroup("thread group-1");
DaemonThread t=new DaemonThread(group,"first thread in group-1");
System.out.println(t.isDaemon());
System.out.println(Thread.currentThread().getThreadGroup().getName());
System.out.println(t.getThreadGroup().getName());
}
/*
结果输出:
main
thread group-1
*/
//从结果可以看出,通过设置之后,线程就属于不同的线程组中了。
}
ThreadGroup类中的某些方法,可以对线程组中的线程产生作用。例如,setMaxPriority()方法可以设定线程组中的所有线程拥有最大的优先权。