【JDK】【线程】测试不同线程优先级下的执行差异
1 前言
本文小看一下 Thread 类里的优先级。
2 优先级
在Thread类中有一个实例属性和两个实例方法,专门用于进行线程优先级相关的操作,与线程 优先级相关的成员属性为:
private int priority;//该属性保存一个Thread实例的优先级,即1~10之间的值
与Thread类线程优先级相关的实例方法为:
方法1:public final int getPriority(),获取线程优先级。
方法2:public final void setPriority(int priority),设置线程优先级。
Thread实例的priority属性默认是级别5,对应的类常量是NORM_PRIORITY。优先级最大值为 10,最小值为1,Thread类中定义的三个优先级常量如下:
public static final int MIN_PRIORITY = 1; public static final int NORM_PRIORITY = 5; public static final int MAX_PRIORITY = 10;
Java中使用抢占式调度模型进行线程调度。priority实例属性的优先级越高,线程获得CPU时间 片的机会越多,但也不是绝对的。举一个例子,顺便演示以上两个线程优先级实例方法的使用,具体如下:
package com.virtuous.demo.laboratory.thread.base; import com.google.common.collect.Lists; import lombok.SneakyThrows; import java.util.List; import java.util.concurrent.TimeUnit; /** * @author: kuku * @description */ public class PriorityTest { static class PriorityDemo extends Thread { PriorityDemo(String name) { super(name); } private long sum = 0; @Override public void run() { while (true) { this.sum++; } } public String getInfo() { return String.format("%s的结果=%s", this.getName(), sum); } } @SneakyThrows public static void main(String[] args) { int size = 10; List<PriorityDemo> list = Lists.newArrayListWithCapacity(10); for (int i = 1; i <= size; i++) { PriorityDemo priorityDemo = new PriorityDemo("p" + i); priorityDemo.setPriority(i); list.add(priorityDemo); } // 启动 list.forEach(PriorityDemo::start); // 停顿一秒种 TimeUnit.SECONDS.sleep(1); // 停止 因为这里没有具体的业务含义,所以直接 stop 业务代码千万别这么停止 list.forEach(PriorityDemo::stop); // 看看每个的sum list.forEach(i -> { System.out.println(i.getInfo()); }); } }
例子中创建了10个线程,放在一个线程数组中。10个线程的优先级各不相同,通过for循环进 行设置,将优先级设置成从1~10:第1线程的优先级最低,其值为1,第10个线程的优先级最高, 其值为10。
在线程的run()方法中,设置了一个没有条件判断表达式的for循环,这是一个死循环,线程启 动之后,永远也不会退出,直到线程被停止。那么,问题来了,如何停止这10个线程呢?这里使用 的Thread类的stop()实例方法,该方法的作用是终止线程的执行。
Thread类的stop()实例方法是一个过时的方法,也是一个不安全的方法。这里的安全指的是系 统资源(文件、网络连接等)的安全——stop()实例方法可能导致资源状态不一致,或者说资源出 现问题时很难定位。在实际开发过程中,不建议使用stop()实例方法。本例非常简单,这里是因为 演示需要,不会存在安全问题,所以使用stop()实例方法来终止线程的执行。
10个线程的运行时间合计1秒,1秒之后,所有的线程停止,演示示例中10个线程停下来之后,某个线程的实例属性 sum 的值越大,就表明该线程 获得的CPU时间片越多。我们看看执行结果:
(1)整体而言,高优先级的线程获得的执行机会更多。在实例中可以看到:优先级在6级以上 的线程和4级以下的线程执行机会明显偏多,整体对比非常明显。
(2)执行机会的获取具有随机性,优先级高的不一定获得的机会多。比如,例子中的thread-10 比thread-9优先级高,但是thread-10所获得的机会反而偏少。
3 小结
好啦,本文主要看看优先级对线程执行的影响情况,也顺便看看怎么统计不同优先级下的各个线程执行的情况,有理解不对的地方欢迎指正哈。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-07-16 【网络】【TCP】如何基于 UDP 协议实现可靠传输?
2023-07-16 【网络】【TCP】TCP 协议有什么缺陷?
2023-07-16 【网络】【TCP】TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?