她与晚风 发表于 2023-5-4 19:36:58

非守护线程睡眠几秒后,守护线程就不守护了吗?



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


sfqxx 发表于 2023-5-4 20:09:36

根据代码和运行结果,非守护线程睡眠几秒后并不会导致守护线程不再守护。

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

虽然mythread1线程调用了sleep方法休眠1秒钟,但这不会影响daemonthread的状态,因此,daemonthread仍然会在后台运行作为守护线程。根据输出结果可以看到,“daemon,”开头的20个输出来自daemonthread,而后面的10个输出来自mythread1,证明守护线程成功运行。

她与晚风 发表于 2023-5-4 20:25:20

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

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

可守护线程不是应该最后执行吗

sfqxx 发表于 2023-5-4 20:27:47

她与晚风 发表于 2023-5-4 20:25
可守护线程不是应该最后执行吗

可守护线程并不是应该最后执行,它只是在主线程结束后会被强制停止,而不会等待其自己执行完毕。在这个例子中,两个线程是同时启动的,当 "daemon" 线程打印完 20 次后,程序就结束了,不会等待 "xxx" 线程继续执行完毕。因此输出结果中 "xxx" 线程只打印出了前 10 个数字。

isdkz 发表于 2023-5-4 20:28:43

守护线程会在所有非守护线程结束时停止运行。在你的代码中,非守护线程myThread1睡眠1秒后继续执行,共执行10次循环。与此同时,守护线程daemonThread在运行时也会执行20次循环。当myThread1完成所有循环并结束时,如果daemonThread仍在执行循环,它会立即停止运行,因为所有非守护线程均已结束。不论非守护线程睡眠多长时间,守护线程会在所有非守护线程结束后停止。

她与晚风 发表于 2023-5-4 20:30:26

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

若没有设置sleep,   它不是最后执行的吗{:9_241:}



"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

sfqxx 发表于 2023-5-4 20:35:14

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




这段代码的输出结果并不是最后执行的,而是程序正常结束并输出信息后才停止的。即便没有设置 `sleep`,也无法保证该代码是最后执行的,因为这取决于操作系统的调度和多线程并发执行的具体情况。

她与晚风 发表于 2023-5-4 20:37:24

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

okok

sfqxx 发表于 2023-5-4 20:38:36

她与晚风 发表于 2023-5-4 20:37
okok

{:5_109:}

她与晚风 发表于 2023-5-4 20:39:27

sfqxx 发表于 2023-5-4 20:38


内个网课老师将的有歧义,我理解错了{:9_224:}
页: [1]
查看完整版本: 非守护线程睡眠几秒后,守护线程就不守护了吗?