java中的后台线程
一. java中的后台线程:
java线程大家都不陌生,可以用继承Thread类或者实现Runable接口来定义一个自己的线程。另外,java线程还可以分为前台线程(也称用户线程或普通线程)和后台线程(Daemon thread),本篇就是要说明这两者的区别和用法。
1. 后台线程会随着主程序的结束而结束,但是前台进程则不会;或者说,只要有一个前台线程未退出,进程就不会终止。(下面的例子会充分说明这一点);
2. 默认情况下,程序员创建的线程是用户线程;用setDaemon(true)可以设置线程为后台线程;而用isDaemon( )则可以判断一个线程是前台线程还是后台线程;
3. jvm的垃圾回收器其实就是一个后台线程;
4. setDaemon函数必须在start函数之前设定,否则会抛出IllegalThreadStateException异常;
二. 例子:
public class RunnableTest implements Runnable {
private String name;
private long delay;
public static void main(String args[]) {
RunnableTest r = new RunnableTest("thread1",200);
Thread t = new Thread(r);
t.setDaemon(true); //后台线程
t.start();
try {
System.in.read();
}
catch(Exception e) {
}
System.out.println("end main");
}
public RunnableTest(String name,long delay) {
this.name = name;
this.delay = delay;
}
public void run(){
try {
while(true) {
System.out.println(name);
Thread.sleep(delay);
}
}
catch(Exception e) {
System.out.println("Exception");
}
}
}
/*
测试结果:
case 1: t.setDaemon(truer); //后台线程
thread1
thread1
thread1
......
thread1
end main
case 2: t.setDaemon(false); //前台线程,相当于不调用setDaemon
thread1
thread1
thread1
......
thread1
end main
thread1
thread1
thread1
......
三. 说明:
1. 在测试过程中,对于上面的case1中的执行,当用户按下回车键,打印完end main,随之整个程序结束,任务管理器中的进程列表中的java.exe(也就是本程序的进程)结束。
2. 对于case2的代码, 当用户按下回车键,打印完end main, 继续打印thread1, 查看任务管理器的进程列表,java.exe(也就是本程序的进程)并没有退出,直到强行结束它,进程才退出,代码也停止打印thread1。