【编程底层思考】Thread.sleep(long millis)和Object的wait(long millis)对当前线程的影响,是否让出CPU,是否释放锁,以及sleep(0)及wait(0)

引言

在Java多线程编程中,合理地使用Thread.sleep(long millis)Object.wait(long millis)不仅可以让出CPU资源,还可以控制线程的执行流程。本文将详细探讨这两种方法对当前线程的影响,包括是否让出CPU以及是否释放锁。

一、Thread.sleep(long millis)

1. 定义

  • Thread.sleep:使当前线程睡眠指定的时间,阻塞当前线程,让出CPU。

2. 作用

  • 让出CPUThread.sleep(long millis)通过让当前线程睡眠指定时间,让出CPU资源。

3. 示例代码

public static void sleepExample() {
    try {
        Thread.sleep(1000);  // Sleep for 1000 milliseconds
        System.out.println("Woke up");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        System.out.println("Interrupted");
    }
}

流程图:Thread.sleep(long millis)

graph TD
    A[开始] --> B[调用Thread.sleep(millis)]
    B --> C[线程阻塞 millis 毫秒]
    C --> D{时间到}
    D -->|是| E[线程继续执行]
    D -->|否| F[继续等待]
    E --> G[结束]
    F --> C
二、Thread.sleep(0)

1. 作用

  • 让出CPUThread.sleep(0)让当前线程放弃当前时间片的剩余部分,允许同一优先级的其他线程运行。

2. 示例代码

public static void sleepZeroExample() {
    try {
        Thread.sleep(0);  // Yield the rest of the current thread's time slice
        System.out.println("After sleep(0)");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        System.out.println("Interrupted");
    }
}

流程图:Thread.sleep(0)

有同优先级线程
无同优先级线程
开始
调用Thread.sleep(0)
放弃当前时间片
检查线程队列
让出CPU
继续执行当前线程
结束
三、Object.wait(long millis)

1. 定义

  • Object.wait:需与synchronized一起使用,当前线程释放对象锁,进入对象的等待队列。

2. 作用

  • 释放锁Object.wait(long millis)通过释放当前线程持有的对象锁,让出CPU。

3. 示例代码

public static void waitExample() {
    Object lock = new Object();
    synchronized(lock) {
        try {
            System.out.println("Waiting");
            lock.wait(1000);  // Wait for 1000 milliseconds
            System.out.println("After wait");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.out.println("Interrupted");
        }
    }
}

流程图:Object.wait(long millis)

开始
调用lock.wait(millis)
释放对象锁
线程进入等待队列
时间到或被唤醒
线程回到同步队列
继续等待
结束等待
锁被重新获取后继续执行
四、Object.wait(0)

1. 作用

  • 释放锁Object.wait(0)Object.wait()相同,释放锁并进入等待池。

2. 示例代码

public static void waitZeroExample() {
    Object lock = new Object();
    synchronized(lock) {
        try {
            System.out.println("Waiting with wait(0)");
            lock.wait(0);  // Equivalent to wait()
            System.out.println("After wait(0)");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.out.println("Interrupted");
        }
    }
}

流程图:Object.wait(0)

被唤醒
等待超时
开始
调用lock.wait(0)
释放对象锁
线程进入等待池
检查唤醒条件
线程回到同步队列
锁被重新获取后继续执行
结束
五、总结
  • Thread.sleep(long millis):使当前线程睡眠指定的时间,阻塞当前线程,让出CPU。
  • Thread.sleep(0):让当前线程放弃当前时间片的剩余部分,允许同一优先级的其他线程运行。
  • Object.wait(long millis):需与synchronized一起使用,当前线程释放对象锁,进入对象的等待队列。
  • Object.wait(0):与Object.wait()相同,释放锁并进入等待池。
汇总表格
方法描述是否让出CPU是否释放锁示例代码
Thread.sleep(long millis)线程睡眠指定时间Thread.sleep(1000);
Thread.sleep(0)放弃当前时间片剩余部分Thread.sleep(0);
Object.wait(long millis)释放对象锁,进入等待队列lock.wait(1000);
Object.wait(0)释放对象锁,进入等待池lock.wait(0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylanioucn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值