【问题标题】:Inconsistent output with thread priorities program与线程优先级程序的输出不一致
【发布时间】:2017-06-30 18:25:02
【问题描述】:

下面的程序应该表明具有较高优先级的线程将占用更多的 CPU 时间。该代码与 Herbert Schildt(印度版)在 The Complete Reference: Java (seventh edition) - Page no 237 & 238 中编写的代码非常相似。

class clicker implements Runnable
{
    long click=0;
    Thread t;
    private volatile boolean running=true;

    public clicker(int p)
    {
        t=new Thread(this,"yo yo");
        t.setPriority(p);
    }

    public void run()
    {
        while(running)
            {click++;}
    }
    public void stop()
    {
        running = false;
    }

    public void start()
    {
        t.start();
    }
}
public class ThreadPriorities {

    public static void main(String[] args) {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        clicker hi=new clicker(Thread.NORM_PRIORITY+2);
        clicker lo=new clicker(Thread.NORM_PRIORITY-2);

        lo.start();
        hi.start();

        try{Thread.sleep(10000);}catch(Exception e){}       

        lo.stop();
        hi.stop();
        try{
            hi.t.join();
            lo.t.join();
        }catch(Exception e){}

        System.out.println("Low priority thread : "+lo.click);
        System.out.println("High priority thread : "+hi.click);
        System.out.println(lo.click<hi.click?true:false);
    }

}

一个输出:

低优先级线程:708527884; 高优先级线程:697458303; 假的

另一个输出:

低优先级线程:676775494; 高优先级线程:687116831; 真的

这可能是什么原因?我有一台 4GB RAM 的 Macbook Air。也许这可能是相关的?请告诉我这些不一致输出的原因。提前致谢。

【问题讨论】:

    标签: java multithreading thread-priority


    【解决方案1】:

    您的两个线程不会相互竞争,因此它们的优先级无关紧要。另一方面,低优先级线程在您创建高优先级线程时正在运行,因此它可能会运行更长时间。

    优先级高的线程会占用更多的CPU时间

    较高的优先级会使事情运行得更快或运行得更多,这是一个常见的误解。这两个线程不相互竞争,所以如果他们竞争,谁赢没有区别。优先级不会让事情进展得更快,它只是让他们在重要的事情上优先考虑。

    输出不一致的原因可能是一个线程在另一个线程不运行时运行的时间量高度依赖于系统当时正在执行的其他操作。

    【讨论】:

      【解决方案2】:

      在程序执行期间,您的机器上可能有一个多核 CPU,其中至少有两个核心线程可用。
      如果您启动的线程数少于 CPU 内核可用的 core * 线程数,则您看不到线程优先级之间的任何实际差异,因为两者都无需暂停即可执行。

      看看这些数字:708527884697458303
      它们之间有大约 1.5% 的差异。几乎什么都没有。

      【讨论】:

        【解决方案3】:

        连续运行 20 次,优先级越高的线程在大多数情况下应该获得更高的数字。线程优先级设置相当松散,给一个线程更高的优先级并不能保证在 10 秒间隔内获得更多关注。在很长一段时间内,它平均会得到更多的关注。

        【讨论】:

        • 这有道理,但是你有这方面的权威参考吗?
        • "时间长了平均会得到更多的关注。" 为什么这么说呢?例如,如果系统不是特别繁忙并且有很多内核,为什么两个线程不能 100% 获得一个内核?
        猜你喜欢
        • 2011-06-25
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多