java - 测试线程优先级。为什么在某些情况下低优先级线程更快?

标签 java multithreading thread-priority

我正在尝试测试 2 个线程,一个具有高优先级,另一个具有低优先级。

根据我的结果,有时低优先级线程速度更快,这怎么可能? 我通过增加每个线程内的点击变量来测试不同优先级的线程。 我还增加或减少了 sleep 时间,但没有任何效果。

由于我在后台没有运行繁重的程序的情况下进行测试,因此我决定使用运行高清电影进行测试,但仍然没有真正的变化,线程始终是相同的速度。

我的电脑是 Intel i5。我运行的是 Windows 7 64 位、16GB RAM

这是代码:

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

最佳答案

你有两个问题。一是线程需要一段时间才能启动,因此您可以通过串行触发它们来给“低”一个很好的开始。另一个是,当存在处理器时间争论时,线程优先级决定谁可以运行。有了两个线程和 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);
 }  

关于java - 测试线程优先级。为什么在某些情况下低优先级线程更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16289637/

相关文章:

c++ - MinGW-w64线程创建失败

c++ 范围和 windows 线程线程

ios - 超高优先级后台工作或 QUARTZ 精度

java - Java中线程优先级到底是做什么的

node.js - 你能定义任务优先级吗?

Java 如何在图像下方添加字符串并调整其大小?

Java - 像素完美碰撞 - 玩家和墙壁之间的间隙

java - 什么是NullPointerException,我该如何解决?

java - 尝试使用 java 类发送电子邮件时抛出错误

c# - Parallel.foreach 不处理所有项目