sleep方法
- 适用场景:
- 线程暂停执行:当需要让当前线程暂停一段时间,不参与CPU调度,但不释放锁资源时使用。例如,模拟一些定时任务,在任务执行间隔需要暂停线程。
- 降低CPU使用率:在循环执行任务且不需要线程一直占用CPU资源的场景下,通过调用
Thread.sleep
方法,让线程进入睡眠状态,减少CPU资源的消耗。
- 示例:
public class SleepExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread is running: " + i);
try {
Thread.sleep(1000); // 线程暂停1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
- 优势:
- 简单易用:直接调用
Thread.sleep
方法即可暂停当前线程,使用方便。
- 不释放锁:如果线程持有锁,调用
sleep
方法时不会释放锁,适合在需要保持锁状态下暂停线程的场景。
- 劣势:
- 无法响应中断:如果在
sleep
期间线程被中断,sleep
方法会抛出InterruptedException
异常,需要在捕获异常后处理中断逻辑,增加了代码复杂度。
- 不能用于线程间通信:
sleep
方法主要用于线程自身的暂停,不能用于线程间的协作和通信。
wait方法
- 适用场景:
- 线程间协作:在多线程协作场景中,当一个线程需要等待某个条件满足后才能继续执行时使用。例如,生产者 - 消费者模型中,消费者线程需要等待生产者线程生产出数据后才能消费。
- 资源共享与同步:当多个线程共享资源,并且需要根据资源状态进行同步时,
wait
方法可以让线程等待资源可用。
- 示例:
public class WaitNotifyExample {
private static final Object lock = new Object();
private static boolean hasDataToProcess = false;
public static void main(String[] args) {
Thread producerThread = new Thread(() -> {
synchronized (lock) {
System.out.println("Producer: Producing data...");
hasDataToProcess = true;
lock.notify(); // 唤醒等待在lock上的线程
}
});
Thread consumerThread = new Thread(() -> {
synchronized (lock) {
while (!hasDataToProcess) {
try {
lock.wait(); // 线程等待,释放lock锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Consumer: Consuming data...");
}
});
consumerThread.start();
producerThread.start();
}
}
- 优势:
- 线程间通信:
wait
方法配合notify
和notifyAll
方法,可以实现线程间的协作和通信,有效解决多线程同步问题。
- 释放锁:调用
wait
方法时,线程会释放持有的锁,允许其他线程获取锁并执行,提高了资源的利用率。
- 劣势:
- 必须在同步块中使用:
wait
方法必须在synchronized
块中调用,否则会抛出IllegalMonitorStateException
异常,限制了其使用场景。
- 复杂的同步逻辑:使用
wait
方法需要正确处理同步块、锁的获取和释放,以及线程间的通知机制,代码复杂度较高。