当前位置: 首页 > 面试题库 >

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

杨彦君
2023-03-14
问题内容

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

根据我的结果,有时低优先级线程速度更快,这怎么可能?我已经通过增加每个线程内的click变量来测试了不同优先级的线程。我也增加和减少了睡眠时间,但是什么也没有。

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

我的电脑是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 API线程优先级(1-10)如何转换为操作系统级别的优先级,因为大多数操作系统没有与此相匹配的线程优先级别(就数量而言)。 因此请记住,在某些情况下,具有不同优先级的两个或多个线程最终会在OS级别获得相同的优先级。 如果我的理解有需要更正,请澄清。 问题答案: 实际上,某些优先级可以映射到相同的“本地”优先级。这是列表(基于OpenJDK 6中的Hotspot代码): Sol

  • 主要内容:1 什么是Java 线程优先级,2 Thread类线程优先级常量,3 Java 线程优先级的例子1 什么是Java 线程优先级 每个线程都有一个优先级。优先级由1到10之间的数字表示。在大多数情况下,线程计划会根据线程的优先级来调度线程(称为抢先式调度)。但是不能保证一定被调用,因为是否被调用取决于JVM选择谁来调度。 2 Thread类线程优先级常量 public static int MIN_PRIORITY public static int NORM_PRIORITY publ

  • 本文向大家介绍说说线程优先级?相关面试题,主要包含被问及说说线程优先级?时的应答技巧和注意事项,需要的朋友参考一下 理论上来说系统会根据优先级来决定首先使哪个线程进入运行状态。当 CPU 比较闲的时候,设置线程优先级几乎不会有任何作用,而且很多操作系统压根不会不会理会你设置的线程优先级,所以不要让业务过度依赖于线程的优先级。 另外,线程优先级具有继承特性比如 A 线程启动 B 线程,则 B 线程的

  • 问题内容: 我有一个在几个线程中运行的程序。主线程与其他线程共享一个对象,在主线程中,我需要调用: 我怀疑主线程饿了,无法访问。如何提高主线程的优先级,或者默认情况下它是否已高于其他线程? 问题答案: 您在Thread类中有一个setPriority()方法。 检查此javadoc。 将线程优先级设置为最大:

  • 问题内容: 这是关于线程优先级的测试。该代码来自《 Thinking in Java p.809》 我不知道为什么我不能得到像这样的常规结果: 但是结果是随机的(每次运行时都会改变): 我在Win 7 64位JDK 7中使用i3-2350M 2C4T CPU,这有关系吗? 问题答案: Java线程优先级无效 线程优先级是高度特定于操作系统的,并且在许多操作系统上的影响通常很小。优先级有助于仅对运行

  • 我目前正在研究分布式应用程序的性能。我的目标是网络组件。目前,每个连接都有一个专用线程,在阻塞模式下处理套接字。我的目标是减少线程数量(不降低性能),如果可能的话,提高性能。 我重新设计了网络组件以使用异步通信,并尝试使用1到2个线程来处理整个网络。我做了一个简单的测试,我从一个节点在一个循环中写入,然后在另一个节点上读取,这是为了测试最大nw线程能力,我发现我的繁忙循环实现消耗了100%的cpu