Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)
Posted 范丰平
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)相关的知识,希望对你有一定的参考价值。
当程序中存在多个任务同时执行时,若多个任务的优先等级不一样,则可通过设定任务对应的线程优先级,使得对应的任务线程具备高优先级执行。通过 Thread.setPriority(线程优先级) 可以实现。示例代码如下所示:
package com.fanfengping.demo; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @Slf4j public class Demo12RunnablePriority implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } log.info("{} 运行中 {}", Thread.currentThread().getName(), i); } } public static void main(String[] args) { Thread threadPriorityA = new Thread(new Demo12RunnablePriority(), "线程 A"); Thread threadPriorityB = new Thread(new Demo12RunnablePriority(), "线程 B"); Thread threadPriorityC = new Thread(new Demo12RunnablePriority(), "线程 C"); /** * 设定线程的优先级;数值越大,优先级越高, * 取值范围 1 - 10,超出范围会抛 IllegalArgumentException 异常 * 默认优先级为 Thread.NORM_PRIORITY = 5 * 子线程默认父线程的优先级,子线程优先级设定不可大于父线程优先级 * 高优先级线程在执行时,相对其他线程拥有优先权,具体执行时由 CPU 调度确定执行 */ threadPriorityC.setPriority(Thread.MAX_PRIORITY); threadPriorityA.setPriority(Thread.MIN_PRIORITY); threadPriorityA.start(); threadPriorityB.start(); threadPriorityC.start(); } }
执行程序,输出内容如下所示:
14:14:50.252 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 0 14:14:50.252 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 0 14:14:50.252 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 0 14:14:50.758 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 1 14:14:50.758 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 1 14:14:50.758 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 1 14:14:51.259 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 2 14:14:51.259 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 2 14:14:51.259 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 2 14:14:51.760 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 3 14:14:51.760 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 3 14:14:51.760 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 3 14:14:52.260 [线程 A] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 A 运行中 4 14:14:52.260 [线程 C] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 C 运行中 4 14:14:52.260 [线程 B] INFO com.fanfengping.demo.Demo12RunnablePriority - 线程 B 运行中 4
由程序输出,可以看出,高优先级线程可能在实际运行中并未完全获得高优先级的执行权,低优先级的线程也可能被优先执行。因而,线程自身的优先级高低,只是有更大的概率获得优先执行,但并非完全的优先执行,线程运行的实际优先级(执行先后顺序)与 CPU 的调度有直接关系。
关于线程优先级,有如下信息仅供参考(若有错误,敬请指正,非常感谢)
- Thread.setPriority()用来设定线程的优先级
- 优先级可以用从1到10的范围指定。10表示最高优先级(Thread.MAX_PRIORITY),1表示最低优先级(Thread.MIN_PRIORITY),5是普通优先级(Thread.NORM_PRIORITY,默认)
- 优先级不能超出1-10的取值范围,否则抛出IllegalArgumentException
- 在线程 start 方法被调用之前,线程的优先级应该被设定
- 线程的优先级不能超过所属线程组的优先级,即可以通过控制线程组的优先级,来控制线程组下线程的最大优先级
- 线程的优先级未设定时,默认所属的线程组的优先级
- 未指定线程优先级时,所有线程都携带普通优先级
- 优先级最高的线程在执行时被给予优先,最终由 CPU 调度程序决定哪一个线程被执行
- 与线程池中等待运行机会的线程相比,当前正在运行的线程可能总是拥有更高的优先级
- 不要嘉定高优先级线程一定先于低优先级的线程运行
- 不要有业务逻辑依赖于线程优先级,结果会无法预期
以上是关于Java学习-075-多线程08:线程优先级 Thread.setPriority(Thread.MAX_PRIORITY)的主要内容,如果未能解决你的问题,请参考以下文章