欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程基础-守护线程与非守护线程

程序员文章站 2022-05-05 21:46:05
...

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执行。