欢迎访问宙启技术站
智能推送

使用wait()函数实现线程的等待和唤醒机制

发布时间:2024-01-02 15:38:54

在多线程编程中,有时候我们需要实现线程的等待和唤醒机制,以实现线程之间的同步。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块中的代码。