本文共 2859 字,大约阅读时间需要 9 分钟。
在Java中,wait()
和notify()
方法是线程编程中的强大工具,用于实现线程间的等待与唤醒机制。它们被ictionary对象提供,是线程安全编程的基础之一。本文将通过两个线程的互动案例,详细解析这两个方法的工作原理及其使用规范。
wait()
方法:使当前线程等待。这意味着线程不会再竞争任何与当前共享对象相关的锁定。这一机制可以节省CPU资源,让线程暂停执行,等待某一特定条件的满足。wait(long timeout)
方法:带有超时参数的等待方法。若在指定时间内没有被notify()
唤醒,超时会被自动抛出。传递负值时,会抛出IllegalStateException
。默认情况下,参数为0,表示无限等待。notify()
方法:唤醒当前线程中等待共享对象锁定的线程之一。notify()
通知的线程会立即返回,重新参与线程调度,但不会立即获得锁。notifyAll()
方法:唤醒所有等候共享对象锁定的线程。与queue
方法类似,但作用范围更大。使用这些方法需要遵循一定规则:
wait()
。InterruptedException
异常,需确保该异常被正确处理。为了直观理解wait()
和notify()
的工作机制,我们设计了一个简单的示例场景:
需求:让一个线程等待,而另一个线程在等待期间进行某种操作,并在完成后唤醒等待线程。
步骤:
Thread0
和Thread1
,分别执行不同的操作。wait()
:当前线程获得锁,并进入等待状态。notify()
:在自己的操作完成后,唤醒等待的Thread0
。示例代码:
public class ThreadWaitAnd Notify { private static Object object = new Object(); // 共享对象 static class Thread0 extends Thread { @Override public void run() { synchronized (object) { System.out.println("Thread-0:获得锁,执行wait()..."); object.wait(); // 线程进入等待状态 System.out.println("Thread-0:从wait()恢复执行"); } } } static class Thread1 extends Thread { @Override public void run() { synchronized (object) { System.out.println("Thread-1:获得锁,执行 notify()..."); object.notify(); // 唤醒等待的线程 System.out.println("Thread-1:完成 notify()操作"); } } } public static void main(String[] args) { Thread0 thread0 = new Thread0(); Thread1 thread1 = new Thread1(); try { thread0.start(); Thread.sleep(500); // 给Thread1时间先启动 thread1.start(); } catch (InterruptedException e) { e.printStackTrace(); } }}
运行输出:
Thread-0:获得锁,执行wait()...Thread-1:获得锁,执行 notify()...Thread-1:完成 notify()操作Thread-0:从wait()恢复执行
这段输出明确展示了线程的等待与唤醒过程:
wait()
后立即退出同步块,进入等待状态。notify()
,通知Thread-0
解除等待。从示例中可以看到,wait()
和notify()
的核心机制包括:
Thread-0
暂停执行,等待消息;Thread-1
获得锁,修改状态,然后唤醒Thread-0
。Thread-1
归还锁;等待的Thread-0
随后重新获取锁,继续执行。注意事项:
wait()
方法,确保每个对象都能被正确管理。InterruptedException
异常,避免死锁或逻辑错误。前文提到的“捡肥皂”故事,相当于一个简单的资源共享场景:
网页内容提到的“老王和老李”,则是最理想的情况:
通过示例和生活化的类比,我们可以清晰地看到wait()
和notify()
方法的作用及其重要性。要正确使用这些方法,需遵守线程安全的原则,并结合实际场景进行合理设计。理解这些方法的使用场景,将有助于我们更好地设计和实现高效的多线程应用程序。
欢迎转载和分享!