线程优先级
java提供一个线程调度器来监控程序中启动后(start)进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行(优先级高的先调度)。使用getPriority()
方法来获取优先级,使用setPriority(int x)
方法来改变优先级。
- 线程的优先级用数字表示,范围从1~10
Thread.MIN_PRIORITY = 1;
Thread.NORM_PRIORITY = 5;
Thread.MAX_PRIORITY = 10;
public class TestPriority {
public static void main(String[] args) {
//主线程优先级
System.out.println(Thread.currentThread().getName()+"--优先级--"+Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();
Thread t0 = new Thread(myPriority);
Thread t1 = new Thread(myPriority);
Thread t2 = new Thread(myPriority);
Thread t3 = new Thread(myPriority);
Thread t4 = new Thread(myPriority);
Thread t5 = new Thread(myPriority);
//先设置优先级,再启动
System.out.println("\n----默认优先级----");
t1.start();//启动线程,并不会立即执行,等待CPU的调度
System.out.println("----默认优先级----\n");
t2.setPriority(3);
t2.start();
t3.setPriority(7);
t3.start();
t4.setPriority(Thread.MAX_PRIORITY);//最大优先级
t4.start();
t5.setPriority(Thread.MIN_PRIORITY);//最小优先级
t5.start();
t0.setPriority(15);//会报错
t0.start();
}
}
class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"--优先级--"+Thread.currentThread().getPriority());
}
}
运行结果:
main--优先级--5
----默认优先级----
Thread-1--优先级--5
----默认优先级----
Thread-2--优先级--3
Thread-3--优先级--7
Thread-4--优先级--10
Thread-5--优先级--1
Exception in thread "main" java.lang.IllegalArgumentException
at java.lang.Thread.setPriority(Thread.java:1089)
at com.study.多线程.demo2.TestPriority.main(TestPriority.java:34)
Process finished with exit code 1
从中我们可以发现,main线程的优先级为5,线程的默认优先级也是5。因为代码量太少,在运行结果中并没有按照优先级高低来执行。所以说优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用,得看CPU的调度。