鱼C论坛

 找回密码
 立即注册
查看: 887|回复: 9

[已解决]非守护线程睡眠几秒后,守护线程就不守护了吗?

[复制链接]
发表于 2023-5-4 19:36:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
public class Demo4 {
    public static void main(String[] args) throws InterruptedException {
        MyThread1 myThread1 = new MyThread1("xxx");
        DaemonThread daemonThread = new DaemonThread("daemon");
        daemonThread.setDaemon(true);
        myThread1.start();
        daemonThread.start();
    }
}

class MyThread1 extends Thread{
    public MyThread1(String name) {
        super(name);
    }

    public MyThread1() {
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        for (int i = 0; i < 10; i++) {
            System.out.println(getName() + ", " + i);
        }
    }
}


class MyThread2 extends Thread{
    @Override
    public void run() {
    }
}

class DaemonThread extends Thread{
    public DaemonThread() {
        super();
    }

    public DaemonThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(getName() + ", " + i);
        }
    }
}








"C:\Program Files\Java\jdk-19\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.2\lib\idea_rt.jar=50811:C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\lenovo\Desktop\鹭\Java\javase\多线程\out\production\code Demo4
daemon, 0
daemon, 1
daemon, 2
daemon, 3
daemon, 4
daemon, 5
daemon, 6
daemon, 7
daemon, 8
daemon, 9
daemon, 10
daemon, 11
daemon, 12
daemon, 13
daemon, 14
daemon, 15
daemon, 16
daemon, 17
daemon, 18
daemon, 19
xxx, 0
xxx, 1
xxx, 2
xxx, 3
xxx, 4
xxx, 5
xxx, 6
xxx, 7
xxx, 8
xxx, 9

Process finished with exit code 0


最佳答案
2023-5-4 20:35:14
她与晚风 发表于 2023-5-4 20:30
若没有设置sleep,   它不是最后执行的吗

这段代码的输出结果并不是最后执行的,而是程序正常结束并输出信息后才停止的。即便没有设置 `sleep`,也无法保证该代码是最后执行的,因为这取决于操作系统的调度和多线程并发执行的具体情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-4 20:09:36 | 显示全部楼层
根据代码和运行结果,非守护线程睡眠几秒后并不会导致守护线程不再守护。

在代码中,创建了一个名为“xxx”的mythread1线程和一个名为“daemon”的daemonthread线程,其中daemonthread被设置为守护线程。在main方法中同时启动这两个线程。

虽然mythread1线程调用了sleep方法休眠1秒钟,但这不会影响daemonthread的状态,因此,daemonthread仍然会在后台运行作为守护线程。根据输出结果可以看到,“daemon,”开头的20个输出来自daemonthread,而后面的10个输出来自mythread1,证明守护线程成功运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 20:25:20 | 显示全部楼层
sfqxx 发表于 2023-5-4 20:09
根据代码和运行结果,非守护线程睡眠几秒后并不会导致守护线程不再守护。

在代码中,创建了一个名为“xx ...

可守护线程不是应该最后执行吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 20:27:47 | 显示全部楼层
她与晚风 发表于 2023-5-4 20:25
可守护线程不是应该最后执行吗

可守护线程并不是应该最后执行,它只是在主线程结束后会被强制停止,而不会等待其自己执行完毕。在这个例子中,两个线程是同时启动的,当 "daemon" 线程打印完 20 次后,程序就结束了,不会等待 "xxx" 线程继续执行完毕。因此输出结果中 "xxx" 线程只打印出了前 10 个数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 20:28:43 | 显示全部楼层
守护线程会在所有非守护线程结束时停止运行。在你的代码中,非守护线程myThread1睡眠1秒后继续执行,共执行10次循环。与此同时,守护线程daemonThread在运行时也会执行20次循环。当myThread1完成所有循环并结束时,如果daemonThread仍在执行循环,它会立即停止运行,因为所有非守护线程均已结束。不论非守护线程睡眠多长时间,守护线程会在所有非守护线程结束后停止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 20:30:26 | 显示全部楼层
sfqxx 发表于 2023-5-4 20:27
可守护线程并不是应该最后执行,它只是在主线程结束后会被强制停止,而不会等待其自己执行完毕。在这个例 ...

若没有设置sleep,   它不是最后执行的吗



"C:\Program Files\Java\jdk-19\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.2\lib\idea_rt.jar=54577:C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\lenovo\Desktop\鹭\Java\javase\多线程\out\production\code Demo4
xxx, 0
xxx, 1
xxx, 2
xxx, 3
xxx, 4
xxx, 5
xxx, 6
xxx, 7
xxx, 8
xxx, 9
daemon, 0
daemon, 1
daemon, 2
daemon, 3
daemon, 4
daemon, 5
daemon, 6
daemon, 7
daemon, 8
daemon, 9
daemon, 10
daemon, 11

Process finished with exit code 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 20:35:14 | 显示全部楼层    本楼为最佳答案   
她与晚风 发表于 2023-5-4 20:30
若没有设置sleep,   它不是最后执行的吗

这段代码的输出结果并不是最后执行的,而是程序正常结束并输出信息后才停止的。即便没有设置 `sleep`,也无法保证该代码是最后执行的,因为这取决于操作系统的调度和多线程并发执行的具体情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 20:37:24 | 显示全部楼层
sfqxx 发表于 2023-5-4 20:35
这段代码的输出结果并不是最后执行的,而是程序正常结束并输出信息后才停止的。即便没有设置 `sleep`,也 ...

okok
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 20:38:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 20:39:27 | 显示全部楼层

内个网课老师将的有歧义,我理解错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表