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

通过设置优先级来执行线程

寇鸿
2023-03-14
问题内容

我按以下顺序设置了线程的优先级

先是A然后是B,然后是C。但是当我在下面的程序中运行时,有时B在A之前运行。我不理解这种执行方式,因为我将B的优先级设置为小于A的优先级。

public class AThread implements Runnable{
    public void run(){
    System.out.println("In thread A");
   }}

  public class BThread implements Runnable {
      public void run(){
    System.out.println("In thread B");  
    } 
   }

 public class CThread implements Runnable {

 public void run(){

    System.out.println("In thread C");

 }

}


 public class ThreadPriorityDemo {

   public static void main(String args[]){

    AThread A = new AThread();
    Thread tA = new Thread(A);


    BThread B = new BThread();
    Thread tB = new Thread(B);

    CThread C = new CThread();
    Thread tC = new Thread(C);

    tA.setPriority(Thread.MAX_PRIORITY);
    tC.setPriority(Thread.MIN_PRIORITY);
    tB.setPriority(tA.getPriority() -1);


    System.out.println("A started");
    tA.start();

    System.out.println("B started");
    tB.start();

    System.out.println("C started");
    tC.start();

}

}


问题答案:

线程优先级可能不是您认为的那样。

线程的优先级是对操作系统的建议,在涉及这两个线程的任何调度或CPU分配决策点中,一个线程优先于另一个线程。但是,如何实现这一点取决于操作系统和JVM的实现。

JavaMex对线程优先级进行了很好的讨论。要点是:

  1. 优先级可能根本没有效果。
  2. 优先级是只有 一个 计算该使然调度的一部分。
  3. 实际上,可以将不同的Java优先级值转换为相同的值(例如,优先级10和9可以相同)。
  4. 每种操作系统都会自行决定如何处理优先级,因为Java使用的是底层操作系统的线程机制

之后一定要阅读下一篇文章,该文章向您展示如何在Linux和Windows上完成它。

认为 您的问题可能出自上述第三点(如果您在Windows上运行),但这可能是其他任何原因。



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

  • 我在这里有一些关于ActiveMQ配置和优先级的类似领域的问题。我目前正在配置ActiveMQ代理以关闭消息持久性。 根据文档,我知道它可以通过代理配置来实现: XML配置文件() 客户端的URI(TCP://localhost:61616?persistent=false) 代理端的 URI-XML配置文件(TCP://localhost:61616?persistent=false)。 我的第

  • 问题内容: Boost库似乎没有用于设置线程优先级的设备。这是在Linux上使用的最佳代码,还是有更好的方法? 我没有很多Linux编程经验。 问题答案: 那是我如何做的基本模板,但是在搜索之后,我发现几乎没有代码示例,因此我猜想是关于最佳还是无效的判断。 问题在于boost :: thread没有允许在创建线程时传递pthead属性的构造函数,因此您必须在线程启动后进行更改。我知道解决该问题的唯

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

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

  • 我使用的是Azkaban 3.4.1,我的一个流有30多个依赖项。有些依赖项比另一个依赖项需要更长的时间。所以,我想把这些流的优先级放在另一个流之前。(因为运行线程有限) 目前,限制了并行执行的数量。我尝试增加该属性,并确保长进程立即启动,但cpu变得非常高,所以我不确定这是一个好的选择。