守护线程:也可以理解为后台线程,之前创建的都是前台线程。
只要线程调用了setDaemon(true);就可以把线程标记为守护线程。
前台后台线程运行时都是一样的,获取CPU的执行权执行。
只有结束的时候有些不同。
前台线程要通过run方法结束,线程结束。
后台线程也可以通过run方法结束,线程结束,还有另一种情况,
当进程中所有的前台线程都结束了,这时无论后台线程处于什么样的状态,都会结束,从而进程会结束。
进程结束依赖的都是前台线程。
//演示停止线程。 class Demo implements Runnable { private boolean flag = true; public synchronized void run() {//不要这么干将synchronized加到run方法这已经变成了单线程了这里是故意这么做为了测试wait() while(flag) { try { wait();//t1 t2 //如果使用notify()必须和wait()在同一个锁里,那如果不在同一个锁怎么办只能用interrupt() } catch (InterruptedException e) { System.out.println(Thread.currentThread().toString()+"....."+e.toString()); changeFlag(); } System.out.println(Thread.currentThread().getName()+"----->"); } } //对标记的修改方法。 public void changeFlag() { flag = false; } } class MStopThreadDemo2 { public static void main(String[] args) { Demo d = new Demo(); Thread t1 = new Thread(d); Thread t2 = new Thread(d); t1.start(); //将t2标记为后台线程,守护线程。 t2.setDaemon(true); //将t2标记为后台线程只要t1线程结束不管t2线程处于什么状态,整个进程都会结束 t2.start(); int x = 0; while(true){ if(++x == 50){ //d.changeFlag();//改变线程任务代码的标记,让其他线程也结束。 //对t1线程对象进行中断状态的清除,强制让其恢复到运行状态。 t1.interrupt(); //对t2线程对象进行中断状态的清除,强制让其恢复到运行状态。 //t2.interrupt();//将这个注释掉将t2改成后台进程,那么只要前台进程结束,不管后台进程处于什么状态整个进程就结束了 break;//跳出循环,主线程可以结束。 } System.out.println("main-------->"+x); } System.out.println("over"); } }