如果守护程序线程在所有用户线程完成之前的优先级如何?

时间:2014-03-31 07:33:40

标签: java multithreading

我已经读过守护程序线程是低优先级线程,它只在没有其他用户线程存活时运行。但是下面的代码没有任何区别。

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

1 个答案:

答案 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低于另一个。