Java多线程处理意外结果

Java多线程处理意外结果,java,multithreading,Java,Multithreading,我正在学习Java中的多线程技术,不过在下面的代码中测量两个线程的相对CPU使用率hi和lo class Clicker implements Runnable{ long click=0; Thread t; private volatile boolean running =true; public Clicker(int p) { t=new Thread(this); t.setPriority(p); } public void run(){ while(ru

我正在学习Java中的多线程技术,不过在下面的代码中测量两个线程的相对CPU使用率hilo

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

public Clicker(int p)
{
    t=new Thread(this);
    t.setPriority(p);
}
public void run(){
    while(running){
        click++;
        }
}

public void stop(){
    running =false;
}

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


public class HiLoPri {

  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(InterruptedException e){
        System.out.println("Main Thread interrupted. ");
        }

    lo.stop();
    hi.stop();

    try{
        hi.t.join();
        lo.t.join();
    }catch(InterruptedException e){
        System.out.println("Interrupted Exception Caught");
    }

    System.out.println("Low priority : " + lo.click);
    System.out.println("High priority : " + hi.click);
         }

}
以下是各种优先级的输出:

  • lo=NORM\u优先级-2和hi=NORM\u优先级+2: 低优先级:1725664879, 高优先级:1774465713 | |高/低=1.02827
  • lo=NORM\u优先级-4和hi=NORM\u优先级+4: 低优先级:2142378792, 高优先级:2180156175 | |高/低=1.01763
  • lo=NORM\u优先级和hi=NORM\u优先级: 低优先级:2582216343, 高优先级:2581415280 | |高/低=0.99968
  • 从输出3中,我了解到在两个优先级相同的线程中,第一个线程的引用稍微多一些

    对于输出1和输出2,请参阅优先级值。当优先级差变大时,计数增加。但当我将差值设置为0(在输出3中)时,与上述观察结果相反,计数显示的是增加而不是减少

    你能解释一下原因吗


    (规范:Java SE 7、AMD A10四核2.3GHz和Window 8)

    Java规范不保证在为线程分配配额时考虑优先级

    每个线程都有优先级。当存在加工竞争时 资源中,具有较高优先级的线程通常在 优先选择优先级较低的线程。这种偏好不是,, 但是,保证最高优先级的线程始终是 无法使用运行和线程优先级来可靠地实现 相互排斥


    线程优先级只是对操作系统的一个提示。如果这个提示有任何作用的话,它将帮助操作系统在需要运行的线程多于逻辑CPU时决定应该运行哪些线程。如果您有足够的空闲CPU,即使是优先级最低的线程也可以随心所欲地运行


    注意:要在Windows上提高线程的优先级,您需要是管理员,在Unix上您需要是root。

    这是多线程,优先级不决定输出的任何内容。它增加了可能性,但不能保证这一点。只有在CPU时间出现争用时,优先级才会真正发挥作用。在四核系统上,在系统试图同时执行4个CPU限制的任务之前,这还不是一个重要的因素。你能解释一下你预期会发生什么以及为什么吗?你确定每次这样做都会得到这个结果吗?