我的代码和输出如下: -
我的问题是主线程和线程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();
}
答案 0 :(得分:0)
t4优先级更高并且它并不意味着t4将首先完成,此外 jvm请求操作系统获取深层操作系统中的线程和所有优先级设置, 你只是设定了一个推荐,这取决于很多事情!
答案 1 :(得分:0)
整数越高,优先级越高。 在任何给定时间,当准备好执行多个线程时,运行时系统选择具有最高优先级的可运行线程来执行。 只有当该线程因某种原因停止,产生或变得不可运行时,优先级较低的线程才会开始执行。
如果两个具有相同优先级的线程正在等待CPU,则调度程序选择其中一个以循环方式运行。
经验法则: 在任何给定时间,优先级最高的线程都在运行。但是,这不是保证。线程调度程序可以选择运行较低优先级的线程以避免饥饿。因此,出于效率目的,仅将优先级用于影响调度策略。不要依赖线程优先级来保证算法的正确性。
我希望上述信息能够澄清您的疑问。