hooyantsing's Blog

16_线程的优先级

字数统计: 400阅读时长: 1 min
2020/08/21

16 线程的优先级

狂神说Java 多线程详解

线程优先级

  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。

  • 线程的优先级用数字表示,范围从 1 ~ 10。超过范围将报异常。 * Thread.MIN_PRIORITY = 1

    • Thread.MAX_PRIORITY = 10
    • Thread.NORM_PRIORITY = 5,默认情况下线程优先级为 5
  • 使用以下方式改变或获取优先级 * getPriority()

    • setPriority(int num),参数值越大,优先级越高,被调度的可能性越大。
      优先级设定要在 start() 方法之前,否则无效

注意:优先级低意味着获得调度的概率低,并不是优先级低就不会被调用了,这都是看CPU的调度(看CPU心情)

从源码角度看优先级

源码来源:java.lang Thread.java

优先级默认值:

5bf8656bdf00339c9e3feca31993a857.png

优先级低于最小值或高于最大值都会抛异常:

4685159de9e015309c705a9a9fb58f07.png

案例

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
package demo2;

public class TestPriority {
public static void main(String[] args) {
// main 线程优先级
System.out.println(Thread.currentThread().getName() + "优先级:" + Thread.currentThread().getPriority());
Runnable runnable = new MyPriority();

Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
Thread t3 = new Thread(runnable);

// 设置优先级
t1.setPriority(1);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(10);

t1.start();
t2.start();
t3.start();
}
}

class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "优先级:" + Thread.currentThread().getPriority());
}
}

运行结果:

第一次:

第二次:

33502e0f58f87d6686b902e214116c2a.png

eb344ac37e9f1c4e69386bd31991a0a3.png

可见,优先级只是让线程更有可能被CPU调度,但实际调度还要看CPU。

CATALOG
  1. 1. 16 线程的优先级
    1. 1.1. 线程优先级
      1. 1.1.1. 从源码角度看优先级
      2. 1.1.2. 案例