Testing thread priority. How come in some cases lo

2019-09-01 10:37发布

我想测试2个线程,一个高,和其他与低优先级。

根据我的结果有时低优先级线程是快,这怎么可能? 我已经通过测试增量的不同优先级的线程每个线程内点击变量。 我还增加和减少睡眠时间,但一无所获。

因为我是用在后台运行,没有沉重的程序测试,我决定用一个高清电影的运行测试,但仍然没有真正的改变,线程都是一样的速度。

我的电脑是英特尔酷睿i5。 我运行Windows 7 64位,16GB内存

这是代码:

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

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




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

    lo.start();
    hi.start();
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {

        e.printStackTrace();
    }
    lo.stop();
    hi.stop();

    try {
        hi.t.join();
        lo.t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("LO: "+lo.click);
    System.out.println("HI: "+hi.click);
 }  
}

Answer 1:

你有两个问题。 其中之一是,线程需要一段时间才能开始,所以你被开除他们关连续给“低”,一个相当不错的开端。 另一种是线程的优先级决定谁可以当有处理器时间的参数运行。 随着两个线程,8个有效的处理器内核,优先级是不会不管了一大堆! 下面是一个使用一个锁存器开始的所有主题为“同步”,并使用足够的线程,他们实际上争夺资源,你可以看到的优先级设置的效果固定的例子。 它提供了相当一致的结果。

static class Clicker implements Runnable{
    BigInteger click = BigInteger.ZERO;
    Thread t;

    Clicker(int p){
        t=new Thread(this);
        t.setPriority(p);
    }

    public void run(){
        try {
        latch.await();
        } catch(InterruptedException ie) {}
        while(running)
            click = click.add(BigInteger.ONE);
    }

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

public static volatile boolean running = true;
public static final CountDownLatch latch = new CountDownLatch(1);

public static void main(String args[]){
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    List<Clicker> listLow = new ArrayList<Clicker>();
    List<Clicker> listHigh = new ArrayList<Clicker>();
    for (int i = 0; i < 16; i++) {
        listHigh.add(new Clicker(Thread.NORM_PRIORITY+4));
    }
    for (int i = 0; i < 16; i++) {
        listLow.add(new Clicker(Thread.NORM_PRIORITY-4));
    }
    for (Clicker clicker: listLow) {
        clicker.start();
    }
    for (Clicker clicker: listHigh) {
        clicker.start();
    }
    latch.countDown();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {

        e.printStackTrace();
    }
    running = false;

    BigInteger lowTotal = BigInteger.ZERO;
    BigInteger highTotal = BigInteger.ZERO;
    try {
        for (Clicker clicker: listLow) {
            clicker.t.join();
            lowTotal = lowTotal.add(clicker.click);
        }
    for (Clicker clicker: listHigh) {
            clicker.t.join();
            highTotal = highTotal.add(clicker.click);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("LO: "+lowTotal);
    System.out.println("HI: "+highTotal);
 }  


Answer 2:

线程优先级不保证有任何影响; 这是在多个地方,包括JDK的javadoc提及。 因此,假设您正在运行的平台基本上忽略的水平,那么它可以追溯到基本stastical概率:有时某些线程似乎跑的比别人快,这取决于调度是如何工作等等。

我不认为任何人真正使用Java线程优先级的一切,因为他们的工作(或缺乏)是最好的平台依赖性。



文章来源: Testing thread priority. How come in some cases low priority threads are faster?