首页 > 技术文章 > 加入一个线程

longfurcat 2018-08-15 20:44 原文

一个线程X可以在其他线程Y之上调用join()方法,其效果是X等待一段时间直到第二个线程Y结束才继续执行。如果某个线程在另一个线程t上调用t.join(),此线程将被挂起,直到目标线程t结束才恢复。
也可以在调用join()时带上一个超时参数(单位可以是毫秒,或者毫秒和纳秒),这样如果目标线程在这段时间到期时还没有结束的话,join方法总能返回。
对join方法的调用可以被中断,做法是在调用线程上调用interrupt方法,这时需要用到try-catch语句。——《Java编程思想》
 
调用谁(线程A)的join方法,就要等谁(A)执行结束。
 
比喻解析:
一般情况    
    假如我开车在路上兜风,经过路边一家店,发现我的朋友在店里,他说他要跟我一块兜风(他调用的他的join方法),我答应了。不过他点了一杯奶茶,要等一会儿。所以我的车就停在原地了,没有继续向前跑。(我要等待它完成)等到他拿到奶茶,上车后,我就继续向前开。(我继续执行我的任务)
    
这里,我和他都是线程,我是线程A,他是线程B。我的任务是开车兜风,而他的任务是等待奶茶完成。
 
超时情况
    他说要等奶茶做好,我说“我可没那么多时间,我给你3分钟”,他答应了。但是过了3分钟,他奶茶还是没好。我不耐烦,就走了(继续执行我的任务)
 
打断情况
    他说等奶茶做好就上车,我就在原地等。突然他接到一个电话,他的组长大发雷霆,叫他马上回公司,他写的代码有问题。然后他对我说“完了,我现在要马上回公司。对不住啊”(他调用了他的interrupt方法)。我骂了一句“艹”,然后继续向前开(继续执行我的任务)。他呢,则奶茶都没来得及拿(他自己的任务也没完成),就会屁颠屁颠地回公司了。

推荐阅读