Java 线程的调度与时间片

🙈作者简介:练习时长两年半的Java up主

🙉个人主页:程序员老茶

🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎

📚系列专栏:Java全栈,计算机系列(火速更新中)

💭 格言:种一棵树最好的时间是十年前,其次是现在

🏡动动小手,点个关注不迷路,感谢宝子们一键三连

目录

  • 课程名:Java
  • [Java 线程的调度与时间片](#Java 线程的调度与时间片)
    • [1. 线程调度](#1. 线程调度)
      • [1.1 分时调度](#1.1 分时调度)
      • [1.2 抢占式调度](#1.2 抢占式调度)
    • [2. 时间片](#2. 时间片)
    • [3. 总结](#3. 总结)

课程名:Java

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

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

Java 线程的调度与时间片

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

1. 线程调度

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

1.1 分时调度

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

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

java 复制代码
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 抢占式调度

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

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

java 复制代码
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
    }
}

2. 时间片

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

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

java 复制代码
try {
    Thread.sleep(1000); // 让线程暂停 1 秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

3. 总结

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

往期专栏
Java全栈开发
数据结构与算法
计算机组成原理
操作系统
数据库系统
物联网控制原理与技术
相关推荐
泥泞开出花朵7 分钟前
LRU缓存淘汰算法的详细介绍与具体实现
java·数据结构·后端·算法·缓存
玉树临风江流儿10 分钟前
QT收费情况
开发语言·qt
ankleless26 分钟前
C语言(02)——标准库函数大全(持续更新)
c语言·开发语言·算法·标准库函数·零基础自学
七七软件开发36 分钟前
团购商城 app 系统架构分析
java·python·小程序·eclipse·系统架构·php
七七软件开发42 分钟前
打车小程序 app 系统架构分析
java·python·小程序·系统架构·交友
_祝你今天愉快1 小时前
Java-JVM探析
android·java·jvm
学编程的司马光1 小时前
Idea集成Jenkins Control插件,在IDEA中触发Jenkins中项目的构建
java·jenkins·intellij-idea
凹凸曼说我是怪兽y1 小时前
python后端之DRF框架(上篇)
开发语言·后端·python
孟君的编程札记1 小时前
别只知道 Redis,真正用好缓存你得懂这些
java·后端
幻雨様1 小时前
UE5多人MOBA+GAS 番外篇:同时造成多种类型伤害,以各种属性值的百分比来应用伤害(版本二)
java·前端·ue5