线程误区-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)。

posted @ 2019-02-22 15:52  hcss  阅读(494)  评论(0编辑  收藏  举报