线程误区-join,wait(里边还是调用的wait)
1.一个线程执行结束后会执行该线程自身对象的notifyAll方法,这个是在jvm中实现的。
2.join的作用是:当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程(thread.join())结束执行,调用线程才会继续执行。。
3.join方法体里只有wait,却没有notify,这是为什么:
当一个线程执行完毕之后,jvm会做清理收尾工作,这个时候才会调用notifyAll。
join
方法是Thread
类的成员方法。上边例子中在main
线程中调用t.join()
的意思就是,使用Thread
对象t
作为锁对象,如果t
线程还活着,就调用wait()
,把main
线程放到与t
对象关联的等待队列里,直到t
线程执行结束,系统会主动调用一下t.notifyAll()
,把与t
对象关联的等待队列中的线程全部移出,从而main
线程可以继续执行。
4.wait()和wait(0)都是无限等待,直至其他线程的notify使wait状态中断。
5.在同一个线程里先后调用wait和notify无意义。
synchronized(yy.a){ try { yy.a.wait(); yy.a.notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } }
调用wait是说当前线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。
6.对于public final synchronized void join(long millis) 方法来说,用synchronized修饰方法,说明是synchronized(this)。