• Java 线程的调度与时间片


    🙈作者简介:练习时长两年半的Java up主
    🙉个人主页:程序员老茶
    🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎
    📚系列专栏:Java全栈,计算机系列(火速更新中)
    💭 格言:种一棵树最好的时间是十年前,其次是现在
    🏡动动小手,点个关注不迷路,感谢宝子们一键三连

    课程名:Java

    内容/作用:知识点/设计/实验/作业/练习

    学习:Java 线程的调度与时间片

    Java 线程的调度与时间片

    在 Java 中,线程调度是通过操作系统来完成的。Java 提供了一些方法来控制线程的执行,但是具体的调度策略是由操作系统来决定的。本文将介绍 Java 线程的调度与时间片的概念,并通过代码示例进行详细解释。

    1. 线程调度

    线程调度是指在多线程环境下,操作系统如何分配 CPU 时间片给各个线程。Java 中的线程调度主要有两种:分时调度和抢占式调度。

    1.1 分时调度

    分时调度是指操作系统将 CPU 时间片分配给每个线程,让它们轮流执行。这种调度策略可以保证每个线程都能得到一定的 CPU 时间,但是不能保证执行顺序。

    在 Java 中,可以通过 Thread.yield() 方法来实现分时调度。当一个线程调用 yield() 方法时,它会放弃当前正在执行的 CPU 时间片,让其他线程有机会执行。

    class MyThread extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + " is running: " + i);
                Thread.yield(); // 让出 CPU 时间片
            }
        }
    }
    
    public class Main {
        public static void main(String[] args) throws InterruptedException {
            MyThread thread1 = new MyThread();
            MyThread thread2 = new MyThread();
            thread1.start();
            thread2.start();
            Thread.sleep(1000); // 等待线程执行完毕
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.2 抢占式调度

    抢占式调度是指操作系统在适当的时候主动中断某个线程的执行,并将其资源分配给其他线程。这种调度策略可以更有效地利用 CPU 资源,但是可能会导致线程执行顺序的不确定性。

    在 Java 中,可以通过 wait()notify()synchronized 关键字来实现抢占式调度。这些方法可以让线程在特定条件下进入等待状态,并在满足条件时被唤醒。

    class MyThread extends Thread {
        private Object lock = new Object();
    
        @Override
        public void run() {
            synchronized (lock) {
                try {
                    System.out.println(Thread.currentThread().getName() + " is waiting...");
                    lock.wait(); // 进入等待状态
                    System.out.println(Thread.currentThread().getName() + " is running...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public class Main {
        public static void main(String[] args) throws InterruptedException {
            MyThread thread1 = new MyThread();
            MyThread thread2 = new MyThread();
            thread1.start();
            thread2.start();
            Thread.sleep(1000); // 等待线程执行完毕
            thread1.lock.notify(); // 唤醒 thread1
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2. 时间片

    时间片是指操作系统为每个线程分配的最小 CPU 执行时间。时间片的大小通常取决于操作系统的设计和硬件的支持。在分时调度策略中,线程的时间片是相等的;而在抢占式调度策略中,线程的时间片可能会有所不同。

    在 Java 中,可以通过 Thread.sleep(long millis) 方法来让线程暂停执行一段时间,这段时间就是线程的时间片。例如,以下代码会让线程暂停 1000 毫秒(即 1 秒):

    try {
        Thread.sleep(1000); // 让线程暂停 1 秒
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 总结

    本文介绍了 Java 线程的调度与时间片的概念,并通过代码示例进行了详细解释。在实际应用中,可以根据需要选择合适的线程调度策略,以提高程序的性能和响应速度。

    往期专栏
    Java全栈开发
    数据结构与算法
    计算机组成原理
    操作系统
    数据库系统
    物联网控制原理与技术
  • 相关阅读:
    校招社招,职业性格测评已日渐成为主流
    怎么调监控清晰度,监控画面不清晰怎么修复?
    麒麟KYLINOS桌面操作系统2303上安装tigervnc
    【Mybatis源码】源码分析
    【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV4)模型算法详解
    双向交错CCM图腾柱无桥单相PFC学习仿真与实现(4)一些优化总结
    PyCharm在debug技巧总结
    骨传导耳机低频差理所当然?飞利浦A6606表示不服
    Spring refresh 方法之invokeBeanFactoryPostProcessors 方法解析
    Python机器学习实战-特征重要性分析方法(2):内置特征重要性(附源码和实现效果)
  • 原文地址:https://blog.csdn.net/qq_53431712/article/details/133623278