线程的阻塞
线程在执行的过程中,会因为等待某个条件的触发进入阻塞状态,例如,控制台阻塞等待接收用户的输入。为了避免线程处于无休止的阻塞态,可以为其指定超时时长。
通过调用join()方法可以等待其它线程的结束或指定等待的时长,该方法的声明如下:
join(timeout=None)
以上方法中,表示timeout参数以秒为单位的超时时长,若参数为None则调用该方法的线程一直处于阻塞状态,直至消亡。
创建多个子线程,阻塞主线程,按照创建的顺序逐个执行完每个线程的任务后,最后再结束主线程,示例代码如下。
def task(): # 子线程待执行的任务
time.sleep(2)
print('子线程%s: 结束'% threading.currentThread().name)
for i in range(5):
# 创建子线程,指定线程执行task()函数
thread = threading.Thread(target=task)
thread.start() # 启动线程
thread.join()
print('主线程结束')
以上代码中,首先定义了线程待执行的任务函数task(),该函数中使用sleep()函数让当前线程休眠了两秒钟,保证子线程的执行时间比主线程长;然后分别创建了5个子线程,每个线程在启动之后会转换为阻塞态,直到先创建的线程优先执行完,再按照顺序执行其它子线程;最后打印“主线程结束”提示用户主线程的执行顺序。
程序的执行结果如下所示:
子线程Thread-1: 结束
子线程Thread-2: 结束
子线程Thread-3: 结束
子线程Thread-4: 结束
子线程Thread-5: 结束
主线程结束
由以上结果可知,首先执行结束的是创建的第一个线程,其次执行结束是创建的第二个线程,以此类推,主线程最后执行结束。