Java线程同步与通信:wait(), notify(), notifyAll(), sleep()
- 1. wait()
- 2. notify()
- 3. notifyAll()
- 4. sleep()
- 4、总结
💖The Begin💖点点关注,收藏不迷路💖 |
Java提供了几种核心方法来实现线程间的同步与通信,主要包括wait()
, notify()
, notifyAll()
, 以及sleep()
。
1. wait()
wait()
方法是 Object
类的一个方法,用于使当前线程进入等待状态,并释放当前持有的对象锁。调用 wait()
方法的线程必须持有该对象的锁,否则将抛出 IllegalMonitorStateException
。该方法通常用在同步代码块或同步方法中。
- 用途:线程等待某个条件成立。
- 特点:释放锁,进入等待队列。
2. notify()
notify()
方法同样是 Object
类的一个方法,用于唤醒在该对象上等待的单个线程。但是,具体唤醒哪个线程取决于JVM的实现,不是按照线程的优先级或等待顺序。
- 用途:唤醒等待该对象的线程中的一个。
- 特点:不释放锁,被唤醒的线程将在获得锁后继续执行。
3. notifyAll()
与 notify()
类似,notifyAll()
方法唤醒在该对象上等待的所有线程。但是,它并不保证这些线程会立即运行,因为所有被唤醒的线程都需要重新竞争锁。
- 用途:唤醒等待该对象的所有线程。
- 特点:不释放锁,但让所有等待的线程都有机会竞争锁。
4. sleep()
虽然 sleep()
方法不直接用于线程同步,但它在线程调度中扮演了重要角色。sleep()
是 Thread
类的一个静态方法,用于使当前线程暂停执行指定的时间(毫秒),期间不会释放任何锁。
- 用途:让当前线程暂停执行一段时间。
- 特点:不释放锁,静态方法,需要捕获
InterruptedException
异常。
4、总结
- wait() 和 notify()/notifyAll():用于线程间的同步与通信,通常与同步代码块或同步方法一起使用,确保线程安全地访问共享资源。
- sleep():用于暂停当前线程的执行,不影响其他线程,也不涉及锁的释放与获取。
💖The End💖点点关注,收藏不迷路💖 |