Java多线程意外结果

时间:2014-06-26 18:42:12

标签: java multithreading

我正在学习Java中的多线程,虽然在下面的代码中测量两个线程 hi lo 的相对CPU使用率。

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);
         }

}

以下是各种优先事项的输出:

  1. lo = NORM_PRIORITY -2和hi = NORM_PRIORITY +2: 低优先级:1725664879, 高优先级:1774465713 ||高/低= 1.02827
  2. lo = NORM_PRIORITY -4和hi = NORM_PRIORITY +4: 低优先级:2142378792, 高优先级:2180156175 ||高/低= 1.01763
  3. lo = NORM_PRIORITY和hi = NORM_PRIORITY: 低优先级:2582216343, 高优先级:2581415280 ||高/低= 0.99968
  4. 从输出3中,我理解了两个具有相同优先级的线程,第一个获得了更多的差异。

    在输出1和输出2的情况下,请参阅优先级值。当优先级差异变高时,计数增加。但是当我设置差值0(​​在输出3中)时,与上述观察相反,计数显示增加而不是减少。

    你能解释一下原因吗?

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

2 个答案:

答案 0 :(得分:1)

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

  

每个帖子都有优先权。有竞争加工时   资源,具有较高优先级的线程通常在执行   对优先级较低的线程的偏好。这种偏好不是,   但是,保证最高优先级的线程永远是   运行,并且线程优先级不能用于可靠地实现   相互排斥。

答案 1 :(得分:0)

线程优先级只是操作系统的一个提示。这个提示,如果它做任何事情,将帮助操作系统决定当你需要运行更多线程时运行哪些线程而不是逻辑CPU。如果你有足够的空闲CPU,即使是最低优先级的线程也会按照自己的意愿运行。

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