引言
在Java多线程编程中,合理地使用Thread.sleep(long millis)
和Object.wait(long millis)
不仅可以让出CPU资源,还可以控制线程的执行流程。本文将详细探讨这两种方法对当前线程的影响,包括是否让出CPU以及是否释放锁。
一、Thread.sleep(long millis)
1. 定义
- Thread.sleep:使当前线程睡眠指定的时间,阻塞当前线程,让出CPU。
2. 作用
- 让出CPU:
Thread.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. 作用
- 让出CPU:
Thread.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)
三、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)
四、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)
五、总结
- 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); |