java吧 关注:1,246,516贴子:12,723,724
  • 6回复贴,共1

[多线程]Thread.join(),深度解析

只看楼主收藏回复

上课时讲到了join这个方法,本来是一笔带过的,后来遇到问题没想到问题接踵而至...join()功能大家都知道但是当你看到Java.Thread.join()的源码时你就感觉好困惑,为此我来个深度解析,在多线程里不深度你永远都不会理解其中的真谛.


IP属地:北京1楼2014-10-28 20:35回复
    二楼学习。出售二楼


    IP属地:北京来自Android客户端2楼2014-10-28 20:37
    回复


      IP属地:河南3楼2014-10-28 20:40
      回复
        通过运行一段测试代码

        然后运行结果:
        Hi 0
        Hi 1Hi 2Hi 3Hi 4Hi 5Hi 6Hi 7
        Main is down!
        ----------------------------
        在这个运行结果中我们看到确实是如果join()方法所解释的一样当前线程停止直至调用join()方法的线程运行结束后开始继续执行.当然问题是看到源码之后(可能是我笨吧一直没想到)


        IP属地:北京4楼2014-10-28 20:41
        回复
          通过源码看到
          这个方法是同步不可重写的方法,如果当我们调用了无参数的join方法时,代码将进入if(millis == 0)的代码块里,在这里不停的判断线程是否存活,如果存活将被等待挂起,关键是迷惑在于synchronized关键字修饰,如我们线程B调用join方法将锁住B的,应该B等待,那为什么它还在运行呢,而且主线程等待.


          IP属地:北京5楼2014-10-28 20:46
          回复
            其实在到代码b.join()时,其实是当前线程(main)去调用的join(),嗯,所以直接阻塞main线程,直到调用join()方法的线程死亡,


            IP属地:北京7楼2014-10-28 20:55
            回复
              楼主,有个地方有点问题
              在这里不停的判断线程是否存活
              不是不停判断,而是一直等待直到超时或者是被唤醒,
              奇怪的是 ,没找到唤醒的语句,应该是线程完毕后调用底层唤醒的


              IP属地:上海8楼2015-09-19 22:38
              回复