当前位置: 首页 > 知识库问答 >
问题:

在Java运行线程时,有哪些条件可以更改线程优先级?

谷梁浩思
2023-03-14

使用此代码:

public static void main(String[] args) throws InterruptedException {
    MyThread testThread = new MyThread();

    System.out.println(testThread.getPriority());

    testThread.start();

    System.out.println(testThread.getPriority());
    testThread.setPriority(7);
    System.out.println(testThread.getPriority());
}

我得到一个setPriority按预期工作的输出--输出是5-5-7。但当注释出最重要的getPriority时,如下所示:

public static void main(String[] args) throws InterruptedException {
    MyThread testThread = new MyThread();

    //System.out.println(testThread.getPriority());

    testThread.start();

    System.out.println(testThread.getPriority());
    testThread.setPriority(7);
    System.out.println(testThread.getPriority());
}

优先级没有任何改变,我得到5-5的输出。为什么会这样?是什么决定了线程的优先级是否被更改?

共有1个答案

越英韶
2023-03-14

如果更改已经运行的线程的优先级,则没有任何影响。例如:

    MyThread testThread = new MyThread();
    System.out.println(testThread.getPriority());
    testThread.start();
    // sleep for 1 second, making sure that testThread is done
    LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
    // reports false
    System.out.println(testThread.isAlive());
    System.out.println(testThread.getPriority());

    testThread.setPriority(8);
    System.out.println(testThread.getPriority());

运行此操作将显示TestThread.SetPriority(8);无效,线程不再活动。

如果我们转到您的示例并添加两个语句:

    System.out.println(testThread.getPriority());
    System.out.println(testThread.isAlive());
    testThread.setPriority(7);
    System.out.println(testThread.isAlive());
    System.out.println(testThread.getPriority());

和不使用system.out.println(TestThread.getPriority())运行代码;-您将看到在一种情况下(当该行被注释时),线程不再活动(与该行未被注释时不同)。从而达到预期的效果。

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

  • 问题内容: 我正在尝试测试2个线程,一个线程具有较高的优先级,而另一个线程具有较低的优先级。 根据我的结果,有时低优先级线程速度更快,这怎么可能?我已经通过增加每个线程内的click变量来测试了不同优先级的线程。我也增加和减少了睡眠时间,但是什么也没有。 由于我是在没有后台运行繁重程序的情况下进行测试的,因此我决定在运行高清影片的情况下进行测试,但仍然没有真正的变化,线程的速度始终相同。 我的电脑

  • 问题内容: Java垃圾收集器以优先级1运行,因此不能保证System.gc()如果被调用将实际执行。 有什么办法可以改变其优先级?如果需要,这将使我能够运行。 问题答案: 垃圾收集器是一个独立线程(如TomHawtin在评论中所提醒,甚至不一定是单个线程),并且其优先级由Java虚拟机确定。这意味着您不能强制垃圾回收。调用告诉运行时环境“现在”可能是运行GC的好时机,但实际上并不能保证立即进行垃

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

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

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