1、线程分类:
守护线程 非守护线程
2、程序线程:
主线程 用户线程 gc线程
**主线程:**一种特殊的非守护线程,但是并不能被设置为守护线程。如果强制设置为守护进行会出现以下Exception
**用户线程:**在主线程中创建的线程。该创建的线程可以被设置为守护线程或者非守护线程
**GC线程:**守护线程
3、主线程与非守护线程
package com.shebao.thread;
/**
* @author: zhaoyihang
* @Date: 2020/9/11 8:49 上午
* @Description: 守护与非守护线程
*/
public class ThreadDemo6 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t1.setName("非守护线程");
t1.start();
for(int i = 1;i<=5;i++){
try{
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(100);
}catch (Exception e){
Thread.currentThread().interrupt();
}
}
System.out.println("主线程执行完毕");
}
}
总结:主线程结束非守护线程仍然可以继续运行。
4、主线程与守护线程
package com.shebao.thread;
/**
* @author: zhaoyihang
* @Date: 2020/9/11 8:49 上午
* @Description: 守护与非守护线程
*/
public class ThreadDemo6 {
public static void main(String[] args) {
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t2.setName("守护线程");
t2.setDaemon(true);
t2.start();
for(int i = 1;i<=5;i++){
try{
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(100);
}catch (Exception e){
Thread.currentThread().interrupt();
}
}
System.out.println("主线程执行完毕");
}
}
总结:主线程结束,守护线程也立即结束(稍等,这句话稍微有点漏洞后面在进行解析)
5、主线程、守护线程、非守护线程
package com.shebao.thread;
/**
* @author: zhaoyihang
* @Date: 2020/9/11 8:49 上午
* @Description: 守护与非守护线程
*/
public class ThreadDemo6 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t1.setName("非守护线程");
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t2.setName("守护线程");
t2.setDaemon(true);
t2.start();
for(int i = 1;i<=5;i++){
try{
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(100);
}catch (Exception e){
Thread.currentThread().interrupt();
}
}
System.out.println("主线程执行完毕");
}
}
从上述可以看出,main线程结束守护线程并没有结束,给上述总结存在相驳。
6、 java虚拟机是如何退出的?
如果虚拟机中剩下的都是守护线程,那么JAVA虚拟机不会管守护线程都会退出。如果线程中还有存活的非守护线程,虚拟机就会等待非守护线程执行结束,在等待的过程中守护线程也可以抢占CPU执行。