java线程是守护进程吗“当且仅当”创建线程是守护进程?

d5vmydt9  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(369)

根据android文档:
当代码在某个线程中运行时,会创建一个新的 Thread 对象时,新线程的优先级最初设置为等于创建线程的优先级,并且仅当创建线程是守护进程时,新线程才是守护进程线程。
在这里使用“当且仅当”这个表达正确吗?
我想我们可以用 setDaemon(true) ,即使主线程是非守护线程。
我想知道我是否误解了这个概念。
以下是我尝试的代码:

public class MyClass {
    public static void main(String[] args) {
        boolean isDaemon;
        isDaemon = Thread.currentThread().isDaemon();
        System.out.println("Is main thread daemon?:" + isDaemon);
        new WorkerThread(true).start();
    }
}

class WorkerThread extends Thread {
    public WorkerThread(boolean tf) {
        setDaemon(tf);
    }

    public void run() {
        boolean isDaemon;
        isDaemon = Thread.currentThread().isDaemon();
        System.out.println("Is worker thread daemon?:" + isDaemon);
    }
}
jk9hmnmh

jk9hmnmh1#

你的理解是正确的,但文件也是正确的。
当您创建一个新线程时,从它的创建线程继承它的守护程序状态,此时新线程是守护程序当且仅当创建线程也是守护程序时。
之后你可以打电话 setDaemon(...) 并更改守护进程状态,但这不会使原始声明无效。最初的声明基本上只讨论线程的创建,而不是它未来的生命周期/配置。
问题中的代码只是将守护进程标志的更改移到了其他地方。当你打电话的时候 setDaemon(tf); 线程已经配置为非守护进程,您只需更改该配置即可。请注意,android规范只讨论了 Thread ,从技术上讲,文档与您的案例完全无关,因为您处理的是 WorkerThread . 实际上,大多数文档仍然是正确的,但确切地说,关于线程继承守护程序状态的语句不再是正确的,因为您显式地更改了该行为。

相关问题