【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  小结

好啦,本文主要看看优先级对线程执行的影响情况,也顺便看看怎么统计不同优先级下的各个线程执行的情况,有理解不对的地方欢迎指正哈。

posted @   酷酷-  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享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 是一个东西吗?
点击右上角即可分享
微信分享提示