【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 守护线程的问题。


相关文章
|
9月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
283 16
|
算法 Unix Linux
linux线程调度策略
linux线程调度策略
295 0
|
11月前
|
开发框架 Java .NET
.net core 非阻塞的异步编程 及 线程调度过程
【11月更文挑战第12天】本文介绍了.NET Core中的非阻塞异步编程,包括其基本概念、实现方式及应用示例。通过`async`和`await`关键字,程序可在等待I/O操作时保持线程不被阻塞,提高性能。文章还详细说明了异步方法的基础示例、线程调度过程、延续任务机制、同步上下文的作用以及如何使用`Task.WhenAll`和`Task.WhenAny`处理多个异步任务的并发执行。
196 1
|
资源调度 算法 Linux
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
3140 0
|
存储 Java 数据处理
进程中的线程调度
进程是应用程序运行的基本单位,包括主线程、用户线程和守护线程。计算机由存储器和处理器协同操作,操作系统设计为分时和分任务模式。在个人PC普及后,基于用户的时间片异步任务操作系统确保了更好的体验和性能。线程作为进程的调度单元,通过覆写`Thread`类的`run`方法来处理任务数据,并由系统调度框架统一管理。微服务架构进一步将应用分解为多个子服务,在不同节点上执行,提高数据处理效率与容错性,特别是在大规模数据存储和处理中表现显著。例如,利用微服务框架可以优化算法,加速业务逻辑处理,并在不同区块间分配海量数据存储任务。
|
12月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
271 0
|
监控 安全 Java
Java中的线程调度与性能优化技巧
Java中的线程调度与性能优化技巧
|
算法 调度
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
1189 3
|
Java Linux API
深入理解Java中的多线程调度策略
深入理解Java中的多线程调度策略
|
安全 算法 Java
JavaSE&多线程&线程池
JavaSE&多线程&线程池
208 7