1.守护线程是一种特殊的线程,它属于是一种陪伴线程。
2. java 中有两种线程:用户线程和守护线程
3.可以通过 isDaemon() 方法来区别它们:如果返回 false ,则说明该线程是“用户线程”;否则就是“守护线程”。
4.典型的守护线程就是垃圾回收线程。只要当前JVM进程中存在任何一个非守护线程没有结束,守护线程就在工作;只有当所以非守护线程结束时,守护线程才会随着JVM一同停止工作。
主线程main是用户线程
public class TestThread4 {
public static void main(String[] args) {
//1.不是守护线程是用户定义的线程
//当我们的用户线程存在就工作,用户线程不存在则停止,来守护用户线程
//System.out.println(Thread.currentThread().isDaemon());
//线程A
Thread threadA = new Thread(new DaemonRunnable(),"子线程A");
// 设置线程A为守护线程,此语句必须在start方法之前执行
//没有的话程序一直进行
threadA.setDaemon(true);
threadA.start();
//线程B用户线程
Thread threadB = new Thread(new DaemonRunnable(),"子线程B");
threadB.start();
//主线程
try {
Thread.sleep(3000);
// 中断用户线程
threadB.interrupt();
//main为用户线程,此时未结束,所有用户线程都结束后 守护线程结束
Thread.sleep(3000);//如果没有这句话的话,就全部结束,如下例子
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class DaemonRunnable implements Runnable{
@Override
public void run() {
int i=0;
try{
while(true){
System.out.println(Thread.currentThread().getName()+"调用第"+ ++i+"次");
Thread.sleep(1000);
}
}catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()+"中断");
}
}
}
子线程A调用第1次
子线程B调用第1次
子线程A调用第2次
子线程B调用第2次
子线程B调用第3次
子线程A调用第3次
子线程B中断
子线程A调用第4次
子线程A调用第5次
子线程A调用第6次
和上面的形成对比
class MyThread implements Runnable {
等3秒后b退出
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+"当前线程是否为守护线程"+Thread.currentThread().isDaemon());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()+"线程退出");
return;
}
}
}
}
public class Thread2 {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread tHread1 = new Thread(myThread, "" + "子线程A");
tHread1.setDaemon(true);
//用户线程
Thread tHread2 = new Thread(myThread, "" + "子线程B");
tHread1.start();
tHread2.start();
Thread.sleep(3000);
tHread2.interrupt();
}
}
子线程A当前线程是否为守护线程true
子线程B当前线程是否为守护线程false
子线程A当前线程是否为守护线程true
子线程B当前线程是否为守护线程false
子线程A当前线程是否为守护线程true
子线程B当前线程是否为守护线程false
子线程B线程退出