Java中join()方法的理解

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。

比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

t.join();   //调用join方法,等待线程t执行完毕
t.join(1000); //等待 t 线程,等待时间是1000毫秒。

下面是一段JDK中的代码:

 /***  Waits at most <code>millis</code> milliseconds for this thread to  * die. A timeout of <code>0</code> means to wait forever.    */public final synchronized void join(long millis)    throws InterruptedException {long base = System.currentTimeMillis();long now = 0;if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (millis == 0) {while (isAlive()) {wait(0);}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}}}

从代码上看,如果线程被生成了,但还未被起动,调用它的 join() 方法是没有作用的,将直接继续向下执行

Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程 ,比如退出后。这就意味着main 线程调用t.join时,必须能够拿到线程t对象的锁。

通过下面一段代码解释:

package ThreadTest;import static java.lang.Thread.currentThread;
import static java.lang.Thread.sleep;/*** Created with IntelliJ IDEA.* User: Blank* Date: 14-3-28* Time: 下午7:49*/
public class TestJoin implements Runnable {public static void main(String[] sure) throws InterruptedException {Thread t = new Thread(new TestJoin());long start = System.currentTimeMillis();t.start();t.join(1000);//等待线程t 1000毫秒System.out.println(System.currentTimeMillis()-start);//打印出时间间隔System.out.println("Main finished");//打印主线程结束}@Overridepublic void run() {// synchronized (currentThread()) {for (int i = 1; i <= 5; i++) {try {sleep(1000);//睡眠5秒,循环是为了方便输出信息} catch (InterruptedException e) {e.printStackTrace();}System.out.println("睡眠" + i);}System.out.println("TestJoin finished");//t线程结束}//}
}

在注释掉synchronized修饰的run方法后,打印信息如下:

可以看到main线程等待了t线程1000毫秒之后,结束了,随后是t线程打印的数据。

那么如果加上run方法的synchronized那条语句呢?结果如下:

由于先调用了t.start()方法,线程进入synchronized代码段,main线程等待一秒以后,还是得不到线程t的对象锁,只能继续等待,直到线程t结束,释放锁。这里可以明确看到main线程等待时间是5000ms,有些文章里写的是t线程执行时间+join方法指定的时间(5000+1000 ),其实不是的,这里可以很清晰的看到,main线程等待时间只有5000ms,看到有的文章说join调用的wait也是需要获取对象锁的。

JDK源代码中wait操作是

public final native void wait(long timeout) throws InterruptedException;

wait内部实现应该是用synchronized,等待时间是5000+1000就好解释了,搞不明白。

此处存疑。

61_有关多线程中join方法详解相关推荐

  1. Java多线程中join方法详解

    join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAli ...

  2. JavaScript中join()方法详解

    前言 最近到了一个新公司,这边这个部门只有一个真正的前端,其他大部分都是后端,同样我也是,不过本人也会一点前端,不过没有那么精,好久没写前端了,都快忘了差不多了,现在来回顾一下. join()使用教程 ...

  3. java线程休眠sleep函数_Java多线程中sleep()方法详解及面试题

    一. Java线程生命周期(五个阶段) 新建状态就绪状态运行状态阻塞状态死亡状态 如图 二.sleep方法 API中的解释 static voidsleep(long millis) 使当前正在执行的 ...

  4. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  5. 【面试:并发篇09:多线程:interrupt 方法详解】

    [面试:并发篇09:多线程:interrupt 方法详解] 00.前言 如果有任何问题请指出,感谢. 01.介绍 程序中,有些线程的中断需要外部干预,比如线程中存在while(true)循环,或者存在 ...

  6. numpy中reshape方法详解

    numpy中reshape方法详解_zhanggonglalala的博客-CSDN博客_reshape

  7. JavaScript中getBoundingClientRect()方法详解

    JavaScript中getBoundingClientRect()方法详解 getBoundingClientRect() 这个方法返回一个矩形对象,包含四个属性:left.top.right和bo ...

  8. Pandas中resample方法详解

    Pandas中resample方法详解 Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法.重新取样时间序列数据. 方便的 ...

  9. php中魔术方法详解

    〝 古人学问遗无力,少壮功夫老始成 〞php中魔术方法详解,在php中有一类方法,很奇怪常,那就是只要满足一定条件,就会自己执行,那就是php中的魔术方法,码字不易,出精品更难,没有特别幸运,那么请先 ...

最新文章

  1. PHP 作为SocketClient发送字节数组
  2. 苹果手机安装应用后无法上网问题的解决方法
  3. 这个机器人一个表情,看过的人不寒而栗
  4. WordPress导航菜单函数register_nav_menus() 和 wp_nav_menu()
  5. php 类遍历,php数组遍历类与用法示例
  6. 分层模型中数据传输过程
  7. 7.1.Zeng_Cache(2) --- 缓存原理
  8. linux支持raid5阵列,Linux中raid磁盘阵列,磁盘阵列raid5
  9. 服务器系统更新后找不到硬盘,重装win10系统找不到硬盘完美解决方法
  10. oracle 日志查看教程,Oracle 查看日志
  11. java 实现短信验证码功能
  12. Java语言与开发环境
  13. Git合并单个文件和[y,n,q,a,d,/,K,j,J,g,e,?]
  14. 还没对Docker加以限制?埋下的安全隐患了解一下
  15. 保留三位有效数字,四舍六入五成双
  16. java夯实基础系列:反射
  17. 终极版C语言(七)-尹成-专题视频课程
  18. 《你好,放大器》----学习记录(二)
  19. Poj 圣诞老人的礼物 贪心
  20. 菜鸟学汇编005 栈(Stack) 和 段寄存器SS、SP

热门文章

  1. 电脑睡眠自动开机问题
  2. Redis的n种妙用,分布式锁,分布式唯一id,消息队列,抽奖……
  3. [转]激励理论荟萃及其启示性应用
  4. 表格数据上下行互换位置
  5. 纳税人基本信息与服务器不符,答疑 | 申请退税后发现申报信息有误咋处理?
  6. 如何模拟世界--游戏的扁平化
  7. 【转】程序员必读书单
  8. 六大设计原则之单一职责原则
  9. linux进入src目录的命令,cd命令
  10. 用 Acrobat 修复因缺少内嵌字体而乱码的 PDF 文件