一、守护线程介绍
线程分为用户线程和守护线程,而守护线程就是为用户线程服务的一种线程,一般具有较低的优先级,用户线程停止,守护线程也就停止了。
举个例子:你在看电视,那么你在看电视可以作为一个用户线程,而电视机运行则就是守护线程,而你不看电视了自然就会关掉电视机。
二、如何创建守护线程
创建守护线程有两种方式:
- 线程实例.setDaemon(true)(也就是直接设置当前线程为守护线程)
- Timer timer = new Timer(true)(实际上是声明当前线程为守护线程)
这里有需要注意的是
- setDaemon(true)必须在调用线程的start()方法之前设置,否则会抛出IllegalThreadStateException异常。
- 在守护线程中产生的新线程也是守护线程。
- 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。(主要是因为可能没运行完就被杀掉了)
package com.rong.Thread;
/**
* 守护线程
* @author Administrator
* 非守护线程结束后,守护线程也会耕者结束,可以说守护线程是为非守护线程进行服务的
*
*/
public class ThreadDaemon {
public static void main(String[] args) {
//守护线程
Thread t1 = new Thread() {
public void run() {
for(int i = 0; i<100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("守护线程");
}
}
};
//非守护线程
Thread t2 = new Thread() {
public void run() {
int i;
for( i = 0; i<=5; i++) {
try {
Thread.sleep(1100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("非守护线程"+"--"+i);
}
}
};
t1.setDaemon(true);//设置t1为守护线程
t1.start();
t2.start();
}
}
运行结果:
/**
守护线程
非守护线程--0
守护线程
非守护线程--1
守护线程
非守护线程--2
守护线程
非守护线程--3
守护线程
非守护线程--4
守护线程
非守护线程--5
**/
我们设置守护线程输出100次,而用户线程输出6次,当用户线程打印6次后,守护线程也不再输出了,也就是说停止了。
至于Timer类,如果不声明它为守护线程,那么当前线程就不会停止。
package com.rong.test;
import java.util.*;
/**
* MyTime类
* @author Administrator
*
*/
public class MyTime extends TimerTask {
@Override
public void run() {
System.out.println("hello word -- "+Thread.currentThread().getName());
}
}
package com.rong.test;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test {
public static void main(String[] args) throws InterruptedException {
System.out.println("系统当前时间:"+new Date());
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, 20);//当前时间后,不然守护线程也执行完了
Date date = calendar.getTime();
MyTime task = new MyTime();
Timer timer = new Timer(true);
timer.schedule(task, date);
}
}
执行结果:系统当前时间:Sat Feb 15 12:00:34 CST 2020