Java多线程与start()方法的优先级关系

时间:2017-12-03 10:31:24

标签: java multithreading thread-priority

我的代码和输出如下: -

我的问题是主线程和线程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();

    }

2 个答案:

答案 0 :(得分:0)

t4优先级更高并且它并不意味着t4将首先完成,此外  jvm请求操作系统获取深层操作系统中的线程和所有优先级设置, 你只是设定了一个推荐,这取决于很多事情!

答案 1 :(得分:0)

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

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

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

我希望上述信息能够澄清您的疑问。