Java 输出与线程优先级程序不一致

Java 输出与线程优先级程序不一致,java,multithreading,thread-priority,Java,Multithreading,Thread Priority,下面的程序应该显示具有更高优先级的线程将占用更多的CPU时间。该代码与Herbert Schildt(印度版)在《完整参考:Java》(第七版)第237和238页中编写的代码非常相似 class clicker implements Runnable { long click=0; Thread t; private volatile boolean running=true; public clicker(int p) { t=new

下面的程序应该显示具有更高优先级的线程将占用更多的CPU时间。该代码与Herbert Schildt(印度版)在《完整参考:Java》(第七版)第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);
    }

}
类clicker实现可运行
{
长点击=0;
螺纹t;
private volatile boolean running=true;
公共点击器(INTP)
{
t=新线程(这个“yo-yo”);
t、 设置优先级(p);
}
公开募捐
{
(跑步时)
{单击++;}
}
公共停车场()
{
运行=错误;
}
公开作废开始()
{
t、 start();
}
}
公共类优先权{
公共静态void main(字符串[]args){
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
clicker hi=新的clicker(线程规范\u优先级+2);
clicker lo=新的clicker(线程规范\u优先级-2);
lo.start();
嗨,开始();
试试{Thread.sleep(10000);}catch(异常e){}
停止();
嗨,停下来;
试一试{
hi.t.join();
lot.join();
}捕获(例外e){}
System.out.println(“低优先级线程:+lo.click”);
System.out.println(“高优先级线程:+hi.click”);

System.out.println(lo.单击连续运行20次,优先级较高的线程在大多数情况下都会得到较高的数目。线程优先级设置相当松散,给一个线程较高的优先级并不能保证在10秒的时间间隔内得到更多的关注。平均而言,它会在很长一段时间内得到更多的关注。

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

看看这些数字:
708527884
697458303


它们之间大约有1.5%的差异。这几乎没有什么。

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

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

优先级越高,运行速度就越快,这是一个常见的误解。这两个线程不会相互竞争,因此如果它们竞争,哪一个会赢也没什么区别。优先级不会使事情发展得更快,它只是在重要的事情上给它们优先权


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

这是有道理的,但是您对此有权威的参考吗?“它平均会在很长一段时间内得到更多的关注。”为什么这么说?例如,如果系统不是特别忙并且有很多内核,为什么不能两个线程都100%地获得一个内核?