我已经读过守护程序线程是低优先级线程,它只在没有其他用户线程存活时运行。但是下面的代码没有任何区别。
public class DaemonThreadTest {
public static void main(String[] args) {
DaemonThread d = new DaemonThread();
Thread t1 = new Thread(d,"daemon");
t1.setDaemon(true);
Thread t2 = new Thread(d,"Non-Daemon");
t1.start();
t2.start();
System.out.println("Main finished");
}}
class DaemonThread implements Runnable{
public void run(){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+ i);
}
}}
输出是,
Main finished
Non-Daemon0
Non-Daemon1
Non-Daemon2
Non-Daemon3
Non-Daemon4
Non-Daemon5
Non-Daemon6
Non-Daemon7
daemon0
daemon1
daemon2
daemon3
daemon4
daemon5
daemon6
daemon7
daemon8
daemon9
Non-Daemon8
Non-Daemon9
答案 0 :(得分:0)
线程优先级主要由操作系统处理,因此它在决定何时允许线程运行时起着重要作用。例如,我运行了几次代码,在一次运行中我得到了这个输出:
Main finished
daemon0
daemon1
daemon2
daemon3
daemon4
daemon5
daemon6
daemon7
daemon8
daemon9
Non-Daemon0
Non-Daemon1
Non-Daemon2
Non-Daemon3
Non-Daemon4
Non-Daemon5
Non-Daemon6
Non-Daemon7
Non-Daemon8
Non-Daemon9
这几乎与您的结果完全相反。虽然您可以尝试手动设置优先级,但最终仍将归结为操作系统如何运行您的线程。
关于守护程序线程,守护程序就像一个&#39;子线程&#39; (或者我想要思考的子线程:))用户线程。这意味着它链接/连接到用户线程。在你的情况下,它链接到主线程,当主线程结束时,守护进程将死于它。但是,因为你有另一个用户线程运行(t2),main方法等待,直到完成。如果你像这样评论t2:
// Thread t2 = new Thread(d,"Non-Daemon");
t1.start();
// t2.start();
然后运行你的程序,你可能会发现守护程序线程永远不会运行,因为主要结束太快,当它退出时会带有守护程序线程。
优先检查
将循环代码语句更改为:
System.out.println(Thread.currentThread().getName()+ i
+ " [Proirity] " + Thread.currentThread().getPriority());
你可以看到自己的优先事项。优先级从1到10缩放,当我运行它时t1和t2优先级为5,因此netiher低于另一个。