Java中线程能否两次调用join()?重复调用的作用是什么?
Java中重复调用
Thread.join()的疑问解答 首先明确Java里Thread.join()的行为:和C/C++不同,Java的线程对象调用join()时,如果线程已经终止,无论调用多少次join()都会立即返回,不会抛出异常,也不存在所谓“不可连接状态”的问题。无参的join()会一直阻塞当前线程,直到目标线程执行完毕为止。
针对你贴出的这段代码:
if (timeout) { try { this.join(); this.join(); } catch(exception e) {} }
连续两次调用无参join()是完全多余的:
- 第一次调用
join()会一直等待到当前线程(this指向的线程)终止,之后的第二次join()会直接立即返回,不会做任何额外操作。 - 就算第一次调用因为中断抛出异常(被catch块吞掉了),第二次调用也不会有任何实际意义——如果线程已经终止,直接返回;如果线程还在运行,那第二次调用还是会继续等待到线程终止,但这和只调用一次的效果完全一致。
可能的成因推测:
- 代码迭代过程中的遗留问题:比如原本两次
join()可能带有不同的超时参数,后来改成无参版本时没删除多余的调用; - 开发者对Java线程模型不熟悉,误将C/C++的线程join逻辑套用到Java上;
- 纯粹的笔误,多写了一次调用。
总结:这段代码里的第二次join()调用没有任何实际作用,保留第一次调用即可实现预期逻辑,多余的调用只会增加代码的困惑性。
内容的提问来源于stack exchange,提问作者web_zai
相关产品推荐
相关产品推荐

