wait 一个Object的方法,目的是将调用 obj.wait()的线程置为 waiting 的状态,等待其他线程调用 obj.notify() 或者 obj.notifyAll() 来唤醒。最常见的就算生产者/消费者功能。 有一点注意的就是,wait/notify 方法的调用必须处在该对象的锁(Monitor)中,也即,再调用这些方法时首先需要获取该对象的锁。否则会抛出 IllegalMonitorStateException异常。 wait/notify的通俗解释: 1. 线程 A 首先获取到 obj 的锁,然后执行了 obj.wait(), 这个方法就会是线程 A 暂时让出对 obj 锁的持有,并把线程 A 转换 waiting 状态,同时加入锁对象的等待队列。 2. 线程 B 获取到了 obj 的锁,然后执行了 obj.notify(), 这个方法通知了锁对象的等待队列,使正在等待队列中的线程 A 为阻塞状态,使 A 进入对 obj 锁的竞争。当然在执行 notify 后并不会使线程 A 马上获取锁,因为线程 B目前还持有 obj的锁。 3. 线程 A 获取 obj 的锁,继续从 wait() 之后的代码运行。 join join 方法通常的解释就是等待调用线程执行完毕,再继续执行当前线程。通常用在多线程的业务上,某个线程运算需要另一个线程的结果时,就可以使用 join。 join 的实现
可见,线程 A 在调用 obj.join() 方法时,obj 线程如果是 alive 状态(线程开启 start,但未结束),那么就执行 wait 方法。同时看 join(long m) 方法是 synchronized 修饰的,这是我们使用 wait 时需要先获取锁的前置条件。既然知道了 join 的内核是 wait 方法,通过对wait 的了解,线程 A 此时是 waiting 的状态,并进入了 obj 的锁的等待队列去。那么需要看一下什么时候释放了线程 A。 了解一下 Thread.exit() 方法。
这个方法由系统调用,当该线程完全退出前给它一个去释放空间。再往下跟到threadTerminated(this) 方法
这里有一个 notifyAll() 的方法,可见就是在这里是线程 A 得到了释放继续运行。 到这里就解释通了,join 的确是通过 wait 方法使调用线程变为等待状态,再在被调用线程运行结束时通过系统调用 exit 方法启动了 notifyAll。 我们可以这么理解,把 obj.join 方法替换成 obj.wait() 方法,并且在 obj 线程运行结束后自动执行 notifyAll() 方法,这样就可以用 wait 的思路来理解 join 的运行原理了。 总结: 1. wait 的注意点:wait 方法是 Object 的方法;wait/notify 方法需要获得对象锁后执行。 2. wait 方法会把调用线程转为等待 waiting 状态,释放对象锁,并进入对象锁的等待队列。 3. notify / notifyAll() 方法会唤醒对象锁的等待队列,使其中的线程进入阻塞 blocking 状态抢占对象锁。 4. 调用 notify/notifyAll 后,在 notify/notifyAll 的前获取获得的对象锁得到释放后,等待队列里的线程才有机会抢占锁继续执行。 5. join 方法的内核就是 wait。在被调用对象的线程运行完毕后,系统自动调用被调用对象的 notifyAll 方法。 标签:调用,join,线程,obj,多线程,方法,wait From: https://www.cnblogs.com/qiezi777/p/16851289.html