使用wait()函数实现线程的等待和唤醒机制
在多线程编程中,有时候我们需要实现线程的等待和唤醒机制,以实现线程之间的同步。Java提供了wait()和notify()等待和唤醒方法来实现线程的等待和唤醒操作。
wait()方法使当前线程等待,直到其他线程调用该对象的notify()或notifyAll()方法唤醒。在调用wait()方法之前,线程必须先获得该对象的锁,否则会抛出IllegalMonitorStateException异常。wait()方法必须在synchronized块中使用。
notify()方法唤醒在该对象上调用wait()方法的某个线程。如果有多个线程在该对象上等待,则由线程规划器随机选择唤醒其中的一个线程。在调用notify()方法之前,线程必须先获得该对象的锁,否则会抛出IllegalMonitorStateException异常。
下面是一个使用wait()和notify()实现线程等待和唤醒的示例代码:
public class MyThread implements Runnable {
private Object lock;
public MyThread(Object lock) {
this.lock = lock;
}
public void run() {
synchronized (lock) {
try {
System.out.println("Thread waiting...");
lock.wait(); // 线程等待
System.out.println("Thread resumed!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread thread = new Thread(new MyThread(lock));
thread.start();
Thread.sleep(2000); // 主线程等待2秒钟
synchronized (lock) {
lock.notify(); // 唤醒等待的线程
}
}
}
在上面的例子中,我们创建了一个MyThread类实现了Runnable接口。在MyThread类中,我们首先获得了lock对象的锁,并调用了lock.wait()方法使当前线程等待。然后在main()方法中,我们创建了一个线程并启动它,然后主线程等待2秒钟后,通过synchronized(lock)块获得了lock对象的锁,并调用了lock.notify()方法唤醒等待的线程。
运行上面的代码,可以看到输出结果中首先输出"Thread waiting...",然后等待2秒钟后输出"Thread resumed!",说明线程成功等待和唤醒。
需要注意的是,wait()和notify()方法必须在同步块内部调用,并且是针对同一对象的锁。并且在调用wait()方法后,线程会释放对象的锁,使其他线程有机会获得锁,并执行synchronized块中的代码。
