【问题标题】:Setting priority to Java's threads设置 Java 线程的优先级
【发布时间】:2009-10-24 13:04:38
【问题描述】:

我有一个在几个线程中运行的程序。主线程与其他线程共享一个对象,在主线程中我调用:

synchronized(obj){
    do stuff
}

我怀疑主线程处于饥饿状态,无法访问obj。如何提高主线程的优先级,还是默认已经高于其他线程的优先级?

【问题讨论】:

  • Macarse 已经处理了如何更改优先级,但也许您可以粘贴更多代码。可能还有其他问题,或者是让其他线程花更少的时间在 obj 上同步的方法。
  • 如何设置20个线程的优先级,因为线程的优先级是1-10,也就是说只能给9个线程优先级......??

标签: java multithreading thread-priority


【解决方案1】:

您在 Thread 类中有一个 setPriority() 方法。

检查this javadoc

将线程优先级设置为最大值:

public static void main(String args[]) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.
}

【讨论】:

  • 所以你说 - 在我创建的每个线程中都执行 setPriority(minimum)。您知道将主线程的优先级设置为最大值的方法吗?它有什么不同吗?
  • 我编辑了我的帖子,介绍了如何为您的主线程设置最大优先级。我不认为这会有所作为。我真的不知道你在做什么,但 Java 线程不应该需要你改变优先级来避免饥饿。
  • 如何设置20个线程的优先级,因为线程的优先级是1-10,也就是说只能给9个线程优先级......??
  • @anshulkatta 不。您可以为多个线程提供相同的优先级。请记住:优先级只是一个提示。它不一定承诺任何事情。如果您需要 3 个以上的优先级,那么您可能会过度设计。
  • @ylun.ca 优先级只是相对的。给予一切最高优先级与给予最低优先级相同。
【解决方案2】:

here系列文章指出了各个平台线程优先级管理的一些复杂性。

我想知道您的根本问题是否仅仅是您的工作线程非常占用 CPU 资源,因此很少达到自然“放开”处理器的程度(例如通过执行一些 IO 或休眠)。如果是这样的话在这种情况下,您可能会在这些工作人员中包含一些对 yield() 的调用,从而为其他线程提供更多机会。

【讨论】:

    【解决方案3】:

    您可以使用 setPriority() 方法。例如:

    new MyThread("Foo").start(); 
    Thread bar = new MyThread("Bar"); 
    bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
    bar.start();
    

    这为 bar 提供了新的优先级,应该很快接管 Foo

    编辑:

    要回答您的评论,您可以使用以下方法设置最大优先级:

    bar.setPriority( Thread.MAX_PRIORITY );
    

    【讨论】:

    • 但您将 MAX_PRIORITY 设置为线程而不是主线程。
    【解决方案4】:

    增加主线程优先级的方式 Macarse 说可能会起作用。但是,您依赖平台的抢占式线程调度程序才能正常工作。你应该在你的工作线程中调用Thread.yield() 静态方法,当它们完成了它们正在运行的任何重要代码部分时。即使您使用不同级别的线程优先级,这也是一个养成的好习惯。

    【讨论】:

      【解决方案5】:

      正如其他人已经回答的那样,您确实可以为线程设置优先级,如下所示:

      Thread.currentThread().setPriority(priority);
      

      但请注意,在您的示例中,线程优先级与线程访问同步对象的顺序无关。 Java 使用其他标准来授予访问权限。 参见例如this

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多