一个测试join()函数的程序
# coding: utf-8
# 测试多线程中join的功能
import threading, time
def doWaiting():
print 'start waiting1: ' + time.strftime('%H:%M:%S') + "n"
time.sleep(3)
print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "n"
def doWaiting1():
print 'start waiting2: ' + time.strftime('%H:%M:%S') + "n"
time.sleep(8)
print 'stop waiting2: ', time.strftime('%H:%M:%S') + "n"
tsk = []
thread1 = threading.Thread(target = doWaiting)
thread1.start()
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1)
thread2.start()
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "n"
for tt in tsk:
tt.join()
print 'end join: ' + time.strftime('%H:%M:%S') + "n"
在join函数不带参数的情况下
运行结果:
start waiting1: 15:10:11n
start waiting2: 15:10:11n
start join: 15:10:11n
stop waiting1: 15:10:14n
stop waiting2: 15:10:19n
end join: 15:10:19n
可以看到,两个线程并行执行,进程1在3s后结束,进程2在8s后结束,然后回到主进程,执行打印「end join」。
、、、、、、
把参数设置为2,观察运行结果
运行结果:
start waiting1: 15:40:02n
start waiting2: 15:40:02n
start join: 15:40:02n
stop waiting1: 15:40:05n
end join: 15:40:06n
stop waiting2: 15:40:10n
可以看到,两个线程开始并发执行,然后执行线程1的join(2),等线程1执行2s后就不管它了,执行线程2的join(2),等线程2执行2s后也不管它了(在此过程中线程1执行结束,打印线程1的结束信息),开始执行主进程,打印「end join」。4s之后线程2执行结束。
总结
当join函数不带参数的时候:join的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的join函数。
当join函数设置超时(带有参数)的时候,通过传给join一个参数来设置超时,也就是超过指定时间join就不在阻塞进程。