一. java中的后台线程:
java线程大家都不陌生,可以用继承Thread类或者实现Runable接口来定义一个自己的线程。另外,java线程还可以分为前台线程(也称用户线程或普通线程)和后台线程(Daemon thread),本篇就是要说明这两者的区别和用法。
1. 后台线程会随着主线程(main线程)的结束而结束,但是前台进程则不会(如果main线程先于前台进程结束,前台进程仍然会执行);或者说,只要有一个前台线程未退出,进程就不会终止。(下面的例子会充分说明这一点);
2. 默认情况下,程序员创建的线程是用户线程;用setDaemon(true)可以设置线程为后台线程;而用isDaemon( )则可以判断一个线程是前台线程还是后台线程;
3. jvm的垃圾回收器其实就是一个后台线程;
4. setDaemon函数必须在start函数之前设定,否则会抛出IllegalThreadStateException异常;
package org.lxh.demo08.b;
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。