join 功能
作者: 莫烦 发布于: 2016-01-01
编辑: 学习资料:
不加 join() 的结果¶
我们让 T1
线程工作的耗时增加.
预想中输出的结果是否为:
T1 start
T1 finish
all done
但实际却是:
T1 start
all done
T1 finish
加入 join() 的结果¶
线程任务还未完成便输出all done
。如果要遵循顺序,可以在启动线程后对它调用join
:
使用join
对控制多个线程的执行顺序非常关键。举个例子,假设我们现在再加一个线程T2
,T2
的任务量较小,会比T1
更快完成:
输出的一种
结果是:
T1 start
T2 start
T2 finish
all done
T1 finish
现在T1
和T2
都没有join
,注意这里说一种
是因为all done
的出现完全取决于两个线程的执行速度, 完全有可能T2 finish
出现在all done
之后。这种杂乱的执行方式是我们不能忍受的,因此要使用join
加以控制。
我们试试在T1
启动后,T2
启动前加上thread_1.join()
:
输出结果:
T1 start
T1 finish
T2 start
all done
T2 finish
可以看到,T2
会等待T1
结束后才开始运行。
如果我们在T2
启动后放上thread_1.join()
会怎么样呢?
输出结果:
T1 start
T2 start
T2 finish
T1 finish
all done
T2
在T1
之后启动,并且因为T2
任务量小会在T1
之前完成;而T1
也因为加了join
,all done
在它完成后才显示。
你也可以添加thread_2.join()
进行尝试,但为了规避不必要的麻烦,推荐如下这种1221
的V型排布: