解决Thread.sleep()造成的忙等待
时间: 2023-10-27 10:51:30 浏览: 177
为了解决Thread.sleep()造成的忙等待问题,可以使用Java提供的线程同步机制来实现等待和通知的机制。
一种常见的方法使用wait()和notify()方法配合使用。具体步骤如下:
1. 在需要等待的地方,使用synchronized关键字锁定一个共享对象。
2. 在等待的地方调用共享对象的wait()方法,使当前线程进入等待状态。
3. 在其他线程中,当满足某个条件时,调用共享对象的notify()或notifyAll()方法来唤醒等待的线程。
4. 被唤醒的线程会重新竞争锁,一旦获得锁,就可以继续执行。
下面是一个示例代码:
```java
class MyTask implements Runnable {
private boolean isReady = false;
public synchronized void setReady(boolean ready) {
this.isReady = ready;
if (isReady) {
notify(); // 唤醒等待的线程
}
}
public synchronized void waitForReady() throws InterruptedException {
while (!isReady) {
wait(); // 等待条件满足
}
}
@Override
public void run() {
try {
// 模拟耗时操作
Thread.sleep(2000);
// 执行完耗时操作后设置为就绪状态
setReady(true);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();
// 等待任务就绪
task.waitForReady();
// 执行任务就绪后的操作
System.out.println("Task is ready!");
}
}
```
在上述示例中,通过wait()和notify()方法实现了线程的等待和通知机制,避免了忙等待的问题。当耗时操作完成后,通过setReady()方法将isReady状态设置为true并唤醒等待的线程。等待的线程在waitForReady()方法中等待条件满足。这样就可以避免了忙等待,提高了线程的效率。
阅读全文