守护线程:即后台线程,与用户线程相对应(前台线程)生命周期同程序生命周期,程序运行结束,守护线程也停止。
package com.dyjava21;
public class Test {
public static void main(String[] args) {
Thread a=new Yo(); //建立线程a
Thread b=new Yu(); //建立线程b
a.start();
b.start();
for(int i=0;i<200;i++){ //main方法内for循环 输出main线程名+i
System.out.println(Thread.currentThread().getName()+"--"+i);
try {
Thread.sleep(190);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.dyjava21;
public class Yu extends Thread {
public void run(){
for (int i = 0; i <200 ; i++) {
System.out.println(Thread.currentThread().getName()+"----"+i);
try {
Thread.sleep(190);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.dyjava21;
public class Yo extends Thread {
public void run(){
while(true){
System.out.println(Thread.currentThread().getName()+"======");
try {
Thread.sleep(190);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
可以看到建立了两个线程a和b 其中a是无限循环输出 b是输出200个停止
还有main线程也是输出200个停止
并且为了看清运行过程 每个线程最后加上sleep 休眠190ms。可以看到运行结果
Thread-1----196
Thread-0======
main--197
Thread-0======
Thread-1----197
main--198
Thread-1----198
Thread-0======
main--199
Thread-1----199
Thread-0======
Thread-0======
Thread-0======
Thread-0======
运行到后面时无限循环还在运行 另外两个停止了。
守护线程是个方法,死循环的线程对象调用setDaemon(true)时会与另外两个有限循环线程一起停止:修改如下
package com.dyjava21;
public class Test {
public static void main(String[] args) {
Thread a=new Yo();
Thread b=new Yu();
a.setDaemon(true); //只需在start之前 调用 而且括号内必须为true才为后台线程(守护线程) 如果为false则为默认的用户线程
a.start();
b.start();
for(int i=0;i<200;i++){
System.out.println(Thread.currentThread().getName()+"--"+i);
try {
Thread.sleep(22);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果为:
Thread-1----196
Thread-0======
Thread-0======
Thread-1----197
main--198
Thread-1----198
Thread-0======
main--199
Thread-0======
Thread-1----199
Thread-0======
Process finished with exit code 0