什么是守护线程?其实守护线程即后台线程,属于用户线程 (而主线程相当于系统级线程)
现在模拟一下守护线程,首先定义一个做测试用的线程:
/**
* 做测试用的线程
*/
class InterruptThread implements Runnable
{
private boolean flag = true;
public synchronized void run()
{
while(flag)
{
try
{
System.out.println(Thread.currentThread().getName()+".......wait();.....等待中............");
wait();
}
catch (InterruptedException ex)
{
flag = false;
System.out.println(Thread.currentThread().getName()+"......InterruptedException....等待结束...."+ex);
}
}
}
public void setFlag()
{
flag=false;
}
}
通过 Thread.setDaemon(boolean on) 方法设置该线程为守护线程,测试如下:
class InterruptThreadDemo
{
public static void main(String[] args)
{
InterruptThread it = new InterruptThread();
Thread t0 = new Thread(it);
Thread t1 = new Thread(it);
//setDaecmon:将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
t0.setDaemon(true);//守护线程(后台线程,相当于用户线程),主线程相当于系统级线程
t0.start(); t1.start();
int num = 0;
for(;;)
{
if(++num==30)
{
it.setFlag();
t0.interrupt();
t1.interrupt();//给正在wait() 或sleep()的线程当头一棒, 叫他们从冻结状态恢复到运行状态,使其获得CPU执行资格
break;
}
System.out.println("..........main---------------->num="+num);
}
if(t0.isAlive())
System.out.println("守护线程t0还活着");
System.out.println("main over!!!!!!!!!");
if(!t0.isAlive())
System.out.println("主线程已挂掉,守护线程t0也跟着挂了............");
}
}
注意: 当正在运行的线程都是守护线程时(既没有主线程),Java 虚拟机将退出!