0%

线程的优先级

线程优先级

java提供一个线程调度器来监控程序中启动后(start)进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行(优先级高的先调度)。使用getPriority()方法来获取优先级,使用setPriority(int x)方法来改变优先级。

  • 线程的优先级用数字表示,范围从1~10
  • Thread.MIN_PRIORITY = 1;
  • Thread.NORM_PRIORITY = 5;
  • Thread.MAX_PRIORITY = 10;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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());
}
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的调度。

若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道