【问题标题】:Java Multi Threading priority relation with start() methodJava 多线程与 start() 方法的优先级关系
【发布时间】:2017-12-03 10:31:24
【问题描述】:

我的代码和输出如下:-

我的问题是主线程和线程 t4 的优先级是 9 而线程 t 的优先级是 5 那么为什么第 1 到 4 行(在输出中标记)在第 5 行之前出现,即为什么 t.start() 优先于t4.start() 将由优先级为 9 的主线​​程执行。

主线程优先级为 9,所以首先 t4.start() 应该被执行,但为什么 t.start() 会先被执行?

如果我颠倒调用 start 方法的顺序,即如果我按顺序调用 t4.start() 然后 t.start() 则输出符合预期。

输出

5

5

Main Thread Priority :9

5

Calling MyRunnable2 from main....9

Child Class                                - line 1

Child Class                                - line 2

End of Child loop                                - line 3

Calling MyRunnable2 from MyThread                - line 4

MyRunnable2 Class....Main....9                   - line 5

MyRunnable2 Class....From MyThread run....5

代码:-

public class ThreadPriority 
{

    public static void main(String[] args) 
    {
        MyThread t = new MyThread();
        System.out.println(Thread.currentThread().getPriority());
        System.out.println(t.getPriority());
        t.setName("From MyThread");

        Thread.currentThread().setPriority(9);

        System.out.println("Main Thread Priority :" + Thread.currentThread().getPriority());
        System.out.println(t.getPriority());



        MyRunnable2 r4 = new MyRunnable2();
        Thread t4 = new Thread(r4,"Main");
        System.out.println("Calling MyRunnable2 from main"+"...."+t4.getPriority());

        t.start();
        t4.start();
    }

}


class MyRunnable2 implements Runnable
{
    public void run()
    {
        System.out.println("MyRunnable2 Class"+"...."+Thread.currentThread().getName()+"...."+Thread.currentThread().getPriority());

    }
}
class MyThread extends Thread
{
    public void run()
    {
        for (int i=0;i<2;i++)
            System.out.println("Child Class");

        System.out.println("End of Child loop");

        MyRunnable2 r2 = new MyRunnable2();
        Thread t2 = new Thread(r2,"From MyThread run");
        System.out.println("Calling MyRunnable2 from MyThread");
        t2.start();

    }

【问题讨论】:

  • 因为优先级对于 Java 线程来说是一个有点坏的概念。这些数字是对操作系统的建议。真正发生的事情取决于实现/操作系统。
  • 嗨@GhostCat这是否意味着我的理解是正确的并且上述行为是异常的?
  • 不,这意味着您不应该使用线程优先级来确定执行顺序。如果您的代码依赖于线程优先级作为正确运行的要求,那么它可能已损坏。如果对您很重要,您应该使用同步或java.util.concurrent
  • 使用线程优先级来确定调度顺序可能适用于单 CPU 机器(任何时候只有一个线程可以执行)。由于当前大多数计算机都有多个内核,因此能够并行运行多个线程,线程优先级的概念就更没用了。

标签: java multithreading thread-priority


【解决方案1】:

t4 优先级较高,并不意味着 t4 会先完成,此外 jvm 向操作系统询问线程和操作系统深层的所有优先级集, 你只是一个推荐,这取决于很多事情!

【讨论】:

    【解决方案2】:

    整数越大,优先级越高。 在任何给定时间,当多个线程准备好执行时,运行时系统会选择具有最高优先级的可运行线程来执行。 只有当该线程停止、屈服或由于某种原因变得不可运行时,较低优先级的线程才会开始执行。

    如果两个具有相同优先级的线程正在等待 CPU,调度程序会选择其中一个以循环方式运行。

    经验法则:在任何给定时间,最高优先级的线程都在运行。但是,这并不能保证。线程调度程序可以选择运行较低优先级的线程以避免饥饿。因此,出于效率目的,仅使用优先级来影响调度策略。不要依赖线程优先级来保证算法的正确性。

    希望以上信息能澄清您的疑问。

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 2015-11-25
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2012-05-12
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多