守护线程
守护线程:
jvm是一个进程,进程的退出前提是保证程序中没有非守护线程的存在,执行完毕就直接退出;
main方法就是一个非守护线程
例:
public class ThreadTest{
public static class MyThread extends Thread{
@Override
public void run(){
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
}
public static void main(String[] args) throws InterruptedException{
MyThread myThread=new MyThread();
//设置myThread为守护线程
myThread.setDaemon(true);
myThread.start();
}
}
1 MyThread 是子线程,main方法是主线程
2 在主线程中子线程实例调用setDaemon(true);传入true就是将子线程设置为了守护线程,传入false就是设置为了非守护线程
这个时候子线程与主线程都是非守护线程,执行结果是
其实就算子线程里的run方法的循环是true也不会循环的,因为进程的结束跟守护线程没关系,只跟非守护线程有关系,只要代码中不存在非守护线程了,那么进程就关闭
非守护线程
将子线程设置为非守护线程,main方法设置 myThread.setDaemon(false);
这样子线程就是非守护线程了,因为会每秒执行一次,执行结果是:每秒打印一次子线程名称,不手动停止程序就会一直这样打印下去
以上就是非守护线程与守护线程的区别,设置就用方法,不设置默认为false
因为线程调度是不公平的,所以多线程执行有可能会出现一个线程执行了很多请求,另外的线程没怎么执行请求的情况,这是正常的,除非手动分配资源
.setDaemon(false/true);