一、setDamon方法
用于将一个尚未调用线程start方法的线程设置为守护线程
1.例一
守护线程随着==最后一个非守护线程的死亡(主线程)==而死亡
import java.util.Date;
class TimeThread extends Thread{
@Override
public void run() {
while (true) {//死循环
Date date = new Date();
System.out.println(date);
try {
Thread.sleep(1000);//让时间线程阻塞,使其1s输出一个结果,便于观察规律
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) {//主线程,这里主线程为最后一个死的线程,所以守护线程会随着主线程的死亡而死亡
TimeThread timeThread = new TimeThread();//创建时间线程
timeThread.setDaemon(true);//将时间线程设置为守护线程(可以将还没有调 用start方法的线程设置为守护线程)
timeThread.start();//timecounterThread线程就绪
try {
Thread.sleep(5000);//5s后守护线程(时间线程)会随着主线程的死亡而死亡
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果
如果上述代码主线程不阻塞5s改为计数器线程阻塞5s,输出结果仍然相同
但是此时主线程在执行完代码后就死了,但是计数器线程(最后一个存活的线程)还要存活5s
5s以后计数器线程死了,时间线程就随着计数器线程的死亡而死亡
2.例二
进程中其他非守护线程不会随着某一个非守护线程的死亡而死亡
import java.util.Date;
public class Test {
public static void main(String[] args) {//主线程
new CounterThread().start();//①计数器线程就绪状态,但是由于计数器线程更强势,先获得了CPU的资源,先进入运行状态
try {
Thread.sleep(5000);//5s后守护线程(时间线程)会随着主线程的死亡而死亡
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class CounterThread extends Thread{
@Override
public void run() {
TimeThread timeThread = new TimeThread();//②创建时间线程
timeThread.setDaemon(true);//③将时间线程设置为守护线程(可以将还没有调 用start方法的线程设置为守护线程)
timeThread.start();//④timecounterThread线程就绪,等待获得CPU的资源
System.out.println("计数器线程死亡");
}
}
class TimeThread extends Thread{
@Override
public void run() {
while (true) {//死循环
Date date = new Date();
System.out.println(date);//⑤时间线程死亡以后,处于就绪状态的时间线程获得了CPU的资源,进入运行状态
try {
Thread.sleep(1000);//让时间线程阻塞,使其1s输出一个结果,便于观察规律
} catch (InterruptedException e) {
e.printStackTrace();
}
//⑥5s之后主线程死亡,时间线程作为守护线程也随之四万
}
}
}
输出结果
3.例三
进程会随着最后一个非守护线程的结束而结束
import java.util.Date;
public class Test {
public static void main(String[] args) {
TimeThread time = new TimeThread();
time.start();
//进程随着时间线程(非守护线程)结束而结束
}
}
class TimeThread extends Thread{
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
执行结果