Part 1:优先级是什么?
1.1 基础概念
- 每个线程都有优先级(1~10的数字)
- 优先级高的线程可能获得更多CPU时间(注意是可能!)
- 默认优先级是5(中庸之道)
1.2 举个栗子🌰
想象有三个学生(线程)举手想回答问题:
- 小明(优先级10):疯狂挥手+站起来
- 小红(优先级5):正常举手
- 小刚(优先级1):懒洋洋地抬下手
老师(JVM):
→ 通常会先点小明,但不一定每次都是(取决于老师心情/具体JVM实现)
Part 2:怎么设置优先级?
2.1 三个预设常量
Thread.MAX_PRIORITY // =10
Thread.NORM_PRIORITY // =5(默认值)
Thread.MIN_PRIORITY // =1
2.2 设置方法
Thread 小明 = new Thread(() -> {
System.out.println("我是最高优先级!");
});
小明.setPriority(Thread.MAX_PRIORITY); // 设为10
小明.start();
2.3 查看优先级
System.out.println("小明优先级:" + 小明.getPriority());
Part 3:实际效果测试
3.1 代码示例
System.out.println("小明优先级:" + 小明.getPriority());
3.2 可能输出
VIP线程 优先级:10
普通线程 优先级:1
VIP线程 优先级:10
VIP线程 优先级:10
普通线程 优先级:1
VIP线程 优先级:10
普通线程 优先级:1
VIP线程 优先级:10
普通线程 优先级:1
普通线程 优先级:1
Part 4:重要注意事项
4.1 优先级不保证顺序
- 高优先级线程不一定先执行完
- 低优先级线程也可能抢占CPU(特别是Windows系统)
4.2 操作系统差异
系统 | 对优先级的支持 |
---|---|
Windows | 有7个优先级级别(映射到Java的1-10) |
Linux | 基本忽略优先级(平等主义!) |
macOS | 部分支持 |
4.3 不要过度依赖
- 错误用法:用优先级控制业务逻辑顺序
- 正确做法:用锁、信号量等同步机制
Part 5:什么时候用优先级?
适合场景
- 后台日志线程 vs 用户交互线程 → 给用户交互更高优先级
- 实时计算任务 vs 普通批处理任务 → 实时任务设高优先级
代码示例(UI优化)
// UI渲染线程(高优先级)
Thread uiThread = new Thread(() -> {
renderUI();
});
uiThread.setPriority(8);
// 日志记录线程(低优先级)
Thread logThread = new Thread(() -> {
writeLogs();
});
logThread.setPriority(3);
曼波小课堂:优先级原理
底层机制
- JVM通过
native setPriority0()
方法调用操作系统API - Windows:调用
SetThreadPriority
- Linux:调用
setpriority(PRIO_PROCESS)
- 实际效果取决于OS的线程调度策略
优先级映射表(Windows)
Java优先级 | Windows优先级 |
---|---|
1 | THREAD_PRIORITY_LOWEST |
5 | THREAD_PRIORITY_NORMAL |
10 | THREAD_PRIORITY_HIGHEST |
Part 6:替代方案推荐
6.1 使用线程池管理
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(高优先级任务);
executor.execute(低优先级任务);
6.2 使用CompletableFuture
CompletableFuture.runAsync(紧急任务)
.thenRunAsync(普通任务);
(✪▽✪)曼波总结:
- 优先级像「建议」而不是命令
- 不同操作系统效果差异大
- 重要业务逻辑不要依赖优先级
- 推荐用更可靠的并发工具类