使用线程优先级程序输出不一致

时间:2017-06-30 18:25:02

标签: java multithreading thread-priority

以下程序应该表明具有较高优先级的线程将占用CPU的更多时间。该代码非常类似于Herbert Schildt(印度版)的完整参考:Java(第七版)中所写的代码 - 第237页和第2页。 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。也许这可能是相关的?请告诉我这些输出不一致的原因。提前谢谢。

3 个答案:

答案 0 :(得分:2)

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

  

具有更高优先级的线程将占用CPU的更多时间

更高的优先级使得运行更快或运行更多是一种常见的误解。这两个线程不会相互竞争,所以如果竞争没有区别,哪一个获胜。优先权不会使事情变得更快,只是在这样的事情很重要的情况下给予他们偏好。

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

答案 1 :(得分:1)

在程序执行期间,您的机器上可能至少有两个可用核心线程的多核CPU 如果您开始的线程数少于CPU核心可用的核心*线程数,则无法看到线程优先级之间存在任何实际差异,因为两者都将被执行而无需暂停。

请看这些数字:708527884697458303 你有大约1.5%的差异。几乎没什么。

答案 2 :(得分:0)

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