快速业务通道

深入浅出Java多线程(1)-方法join - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

深入浅出Java多线程(1)-方法join

时间:2010-12-09 advincenting

对于Java开发人员,多线程应该是必须熟练应用的知识点,特别是开发基于 Java语言的产品。本文将深入浅出的表述Java多线程的知识点,在后续的系列里 将侧重于Java5由Doug Lea教授提供的Concurrent并行包的设计思想以及具体实 现与应用。

如何才能深入浅出呢,我的理解是带着问题,而不是泛泛的看。所以该系列 基本以解决问题为主,当然我也非常希望读者能够提出更好的解决问题的方案以 及提出更多的问题。由于水平有限,如果有什么错误之处,请大家提出,共同讨 论,总之,我希望通过该系列我们能够深入理解Java多线程来解决我们实际开发 的问题。

作为开发人员,我想没有必要讨论多线程的基础知识,比如什么是线程?如何创建等 ,这些知识点是可以通过书本和Google获得的。本系列主要是如何理 深入解多线程来帮助我们平时的开发,比如线程池如何实现?如何应用锁等。  

(1)方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答。

自从接触Java多线程,一直对Join理解不了。JDK是这样说的:

join    public final void join(long millis)throws InterruptedException    Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.

大家能理解吗? 字面意思是等待一段时间直到这个线程死亡,我的疑问是那 个线程,是它本身的线程还是调用它的线程的,上代码:

package concurrentstudy; /** * * @author vma */ public class JoinTest {    public static void main(String[] args) {      Thread t = new Thread(new RunnableImpl());      t.start();      try {        t.join(1000);        System.out.println("joinFinish");      } catch (InterruptedException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }    } } class RunnableImpl implements Runnable {    @Override    public void run() {      try {        System.out.println("Begin sleep");        Thread.sleep(1000);       System.out.println("End sleep");      } catch (InterruptedException e) {        e.printStackTrace();      }    } }

结果是:

Begin sleep End sleep joinFinish

深入浅出Java多线程(1)-方法join(2)

时间:2010-12-09 advincenting

明白了吧,当main线程调用t.join时,main线程等待t线程,等待时间是1000 ,如果t线程Sleep 2000呢

public void run() {      try {        System.out.println("Begin sleep");        // Thread.sleep(1000);        Thread.sleep(2000);       System.out.println("End sleep");      } catch (InterruptedException e) {        e.printStackTrace();      }    }

结果是:

Begin sleep

joinFinish

End sleep

也就是说main线程只等1000毫秒,不管T什么时候结束,如果是t.join()呢, 看代码:

public final void join() throws InterruptedException {    join(0);    }

就是说如果是t.join() = t.join(0) 0 JDK这样说的 A timeout of 0 means to wait forever 字面意思是永远等待,是这样吗?

其实是等到t结束后。

这个是怎么实现的吗? 看JDK代码:

/**    * Waits at most <code>millis</code> milliseconds for this thread to    * die. A timeout o

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号