您的位置:首页 > 编程语言 > Java开发

简单理解JAVA中什么是守护线程,什么是非守护线程?

2019-02-18 22:32 92 查看

java中守护线程和非守护线程

  • 守护线程与非守护线程代码演示区别
  • 什么是守护线程,什么是非守护线程?

    java有两种状态的线程

    1.守护线程(例如垃圾回收线程:gc线程
    2.非守护线程(用户线程:用户线程即我们手动创建的线程)

    守护线程与非守护线程的区别

    1.守护线程
    有一个特征,例如当主线程运行的时候,垃圾回收线程一起运行。
    主线程销毁,会和主线程一起销毁。
    2.非守护线程
    如果主线程销毁,用户线程继续运行且互不影响。

    守护线程与非守护线程代码演示区别

    创建守护线程

    public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(new Runnable() {
    
    public void run() {
    while (true) {
    try {
    Thread.sleep(1000);
    
    } catch (Exception e) {
    // TODO: handle exception
    }
    System.out.println("我是子线程(用户线程)");
    }
    }
    });
    // 标识当前方法为守护线程,一定要在启动线程前设置为守护线程
    t1.setDaemon(true);
    t1.start();

    必须在t1.start()之前设置,你不能把正在运行的常规线程设置为守护线程,否则报IllegalThreadStateException异常

    守护线程:主线程销毁停止,守护线程一起销毁

    public static void main(String[] args) {
    Thread t1 = new Thread(new Runnable() {
    
    public void run() {
    while (true) {
    try {
    Thread.sleep(1000);
    
    } catch (Exception e) {
    // TODO: handle exception
    }
    System.out.println("我是子线程(用户线程)");
    }
    }
    });
    // 标识当前方法为守护线程,一定要在启动线程前设置为守护线程
    t1.setDaemon(true);
    //启动线程
    t1.start();
    
    //相当与主线程
    for (int i = 0; i < 10; i++) {
    try {
    Thread.sleep(300);
    } catch (Exception e) {
    e.printStackTrace();
    }
    System.out.println("main:i:" + i);
    }
    System.out.println("主线程执行完毕...");
    }

    以下为运行结果:

    main:i:0
    main:i:1
    main:i:2
    我是子线程(用户线程)
    main:i:3
    main:i:4
    main:i:5
    我是子线程(用户线程)
    main:i:6
    main:i:7
    main:i:8
    我是子线程(用户线程)
    main:i:9
    主线程执行完毕...

    主线程结束之后并没有在继续运行守护线程,守护线程也跟着结束,一起销毁停止。

    非守护线程:如果主线程销毁,用户线程继续运行且互不影响。

    public static void main(String[] args) {
    Thread t1 = new Thread(new Runnable() {
    
    public void run() {
    while (true) {
    try {
    Thread.sleep(1000);
    
    } catch (Exception e) {
    // TODO: handle exception
    }
    System.out.println("我是子线程(用户线程)");
    }
    }
    });
    //启动线程
    t1.start();
    
    //相当与主线程
    for (int i = 0; i < 10; i++) {
    try {
    Thread.sleep(300);
    } catch (Exception e) {
    e.printStackTrace();
    }
    System.out.println("main:i:" + i);
    }
    System.out.println("主线程执行完毕...");
    }

    以下为运行结果:

    main:i:0
    main:i:1
    main:i:2
    我是子线程(用户线程)
    main:i:3
    main:i:4
    main:i:5
    我是子线程(用户线程)
    main:i:6
    main:i:7
    main:i:8
    我是子线程(用户线程)
    main:i:9
    主线程执行完毕...我是子线程(用户线程)
    我是子线程(用户线程)
    我是子线程(用户线程)
    我是子线程(用户线程)
    我是子线程(用户线程)
    我是子线程(用户线程)
    。。。。。。。。。。。。。。。。。。。。。
    

    当主线程销毁停止,非守护线程(用户线程)并没有结束,而是一直在执行,与主线程互不影响。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: