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

  • 相关阅读:
    centos7
    aaa
    20199122 2019-2020-2 《网络攻防实践》第三周作业
    20189304李小涛网络攻防第二周作业
    20189304《网络攻防》第一周作业
    2019-2020-2 20199137 《网络攻防实践》第三次作业
    容器抓包方法
    打印输出10分钟日志内容
    linux shell 检查脚本参数
    Structure needs cleaning(结构需要清理)解决
  • 原文地址:https://www.cnblogs.com/hongchengshise/p/10418849.html
Copyright © 2020-2023  润新知