【JavaSE专栏85】线程优先权,线程调度谁先谁后一目了然

简介: 【JavaSE专栏85】线程优先权,线程调度谁先谁后一目了然

本文讲解了 Java 中线程优先权的模拟和其应用场景,并给出了样例代码。线程优先级是指操作系统在调度多个线程时给予每个线程的优先级。

一、什么是线程优先级

线程优先级是指操作系统在调度多个线程时给予每个线程的优先级

Java 中使用整数表示线程的优先级,优先级的范围是 1 11Thread.MIN_PRIORITY)到 10 1010Thread.MAX_PRIORITY),默认为 5 55Thread.NORM_PRIORITY)。

线程优先级决定了线程在竞争CPU执行时间时的优先级顺序。高优先级的线程将具有更高的竞争优先级,操作系统会倾向于先执行高优先级线程,线程优先级并不能保证绝对的执行顺序,具体的线程调度还受到操作系统和处理器的调度策略的影响。

使用线程优先级可以对线程的执行顺序进行一定的控制,例如,当有多个线程需要竞争共享资源时,可以将资源访问频率较高的线程设置为较高的优先级,这样可以增加该线程被执行的概率,提高系统的吞吐量。

线程优先级只是一种提示,操作系统不一定会严格按照优先级顺序进行调度,尤其在多核处理器上更为复杂。

因此,同学们在编写多线程程序时,不应过分依赖线程优先级来实现程序的正确性和可靠性,而应使用其他机制来确保线程的正确执行顺序和资源的正确访问。

总结起来,线程优先级是一种用于提示操作系统线程调度的机制,通过设置不同的优先级,可以对线程的执行顺序进行一定的控制,但并不能保证绝对的执行顺序


二、线程优先权的作用

线程优先级在 Java 中用于指定线程的调度顺序,即操作系统在选择下一个要执行的线程时会考虑线程的优先级,线程优先级的作用主要体现在以下 3 33 个方面,请同学们认真学习。

  1. 线程调度:操作系统会倾向于优先选择优先级较高的线程来执行,尤其是在 CPU 资源有限的情况下,高优先级的线程会比低优先级的线程更早地获得 CPU 时间片,从而提高线程被执行的概率。
  2. 竞争资源:在线程竞争共享资源的情况下,通过设置适当的线程优先级,可以增加某个线程被执行的概率,从而提高系统的吞吐量。例如,将访问某个共享数据频率较高的线程设置为较高的优先级,可以增加该线程被执行的机会,提高系统的效率。
  3. 响应性:高优先级线程往往能更快地响应某些事件,因为操作系统会优先选择执行优先级较高的线程,在需要及时响应、实时性要求较高的场景下,适当设置线程优先级可以提高系统的响应能力。

线程优先级只是一种提示,操作系统并不一定会严格按照优先级顺序进行调度,具体的线程调度还受到操作系统和处理器的调度策略的影响。

因此,同学们在编写多线程程序时,不应过分依赖线程优先级来实现程序的正确性和可靠性,而应使用其他机制(如 信号量 等)来确保线程的正确执行顺序和资源的正确访问。


三、模拟线程优先权

以下是一个使用 Java 模拟线程优先级的示例代码,请同学们复制到本地执行。

public class ThreadPriorityExample {
    public static void main(String[] args) {
        // 创建两个线程
        Thread thread1 = new MyThread("Thread 1");
        Thread thread2 = new MyThread("Thread 2");
        // 设置线程优先级
        thread1.setPriority(Thread.MAX_PRIORITY);
        thread2.setPriority(Thread.MIN_PRIORITY);
        // 启动线程
        thread1.start();
        thread2.start();
    }
    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(getName() + " running");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在这个示例中,我们创建了两个线程 Thread 1Thread 2,并分别设置它们的优先级为最高(Thread.MAX_PRIORITY)和最低(Thread.MIN_PRIORITY),然后,我们使用 start() 方法启动这两个线程。

在每个线程的 run() 方法中,线程会打印自己的名字并休眠 500 500500 毫秒。通过设置不同的线程优先级,可以观察到优先级较高的线程更频繁地被执行。

具体的线程调度还受到操作系统和处理器的调度策略的影响,因此线程优先级并不能保证绝对的执行顺序,在编写多线程程序时,应该根据具体的需求合理设置线程优先级,并结合其他机制来确保程序的正确性和可靠性。


四、线程优先权高低的影响

线程优先级的高低会对线程的调度顺序产生影响,具体表现在以下 3 33 个方面,请同学们认真学习。

  1. 竞争 CPU 时间片:操作系统会倾向于优先选择优先级较高的线程来执行,从而使得高优先级的线程更频繁地获得 CPU 时间片。这意味着在有限的CPU资源下,高优先级的线程有更大的机会被执行,从而提高了其执行的概率。
  2. 竞争共享资源:当多个线程竞争访问共享资源时,线程优先级的设置可以影响线程获取资源的顺序。高优先级的线程在竞争资源时会被优先执行,从而可能更快地获取到共享资源,提高了系统的吞吐量。
  3. 响应性:高优先级线程能够更快地响应某些事件。操作系统通常会优先选择执行优先级较高的线程,因此在某些需要及时响应、具有实时性要求的场景中,适当设置线程优先级可以提高系统的响应能力。

所以同学们在编写多线程程序时,不应过分依赖线程优先级来实现程序的正确性和可靠性,而应使用其他机制(例如锁、信号量等)来确保线程的正确执行顺序和资源的正确访问。

同时,过度依赖线程优先级可能会导致线程饥饿或优先级倒置等问题,因此应慎重使用。


五、线程优先权面试题

  1. 什么是线程优先级?
  2. Java 中线程优先级的范围是多少?
  3. 如何设置线程的优先级?
  4. 线程优先级的作用是什么?
  5. 线程优先级的调度规则是怎样的?
  6. 优先级较高的线程一定会比优先级较低的线程先执行吗?
  7. 为什么不建议过度依赖线程优先级来实现程序的正确性和可靠性?

六、总结

本文讲解了 Java 中线程优先权的模拟和其应用场景,并给出了样例代码,在下一篇博客中,将讲解 Java 守护线程的问题。


相关文章
|
2月前
|
安全 Java 调度
【Java】JavaSE实现多线程
【Java】JavaSE实现多线程
67 1
|
2月前
|
资源调度 算法 Linux
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
541 0
|
4天前
|
算法 Java 调度
JavaSE—线程介绍(超详细!)
JavaSE—线程介绍(超详细!)
|
2月前
|
算法 调度
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
163 3
|
2月前
|
存储 Java 调度
Java多线程基础-1:通俗简介操作系统之进程的管理与调度
操作系统是一个复杂的软件,具备许多功能。其中,进程的管理与调度是与我们密切相关的。本文将对操作系统功能中进程管理与调度作出介绍。
32 0
|
2月前
|
Java 调度
多线程的基本概念和实现方式,线程的调度,守护线程、礼让线程、插入线程
多线程的基本概念和实现方式,线程的调度,守护线程、礼让线程、插入线程
27 0
|
2月前
|
Java API 调度
JavaSE基础精选-多线程
JavaSE基础精选-多线程
25 0
|
2月前
|
安全 算法 Java
JavaSE&多线程&线程池
JavaSE&多线程&线程池
153 7
|
2月前
|
算法 Linux 调度
Linux 线程介绍:介绍Linux系统中线程的基本概念、创建和调度机制
Linux 线程介绍:介绍Linux系统中线程的基本概念、创建和调度机制
58 0
|
2月前
|
算法 程序员 调度
操作系统:线程同步和调度
操作系统:线程同步和调度
40 0