学科分类
目录

线程的阻塞

线程在执行的过程中,会因为等待某个条件的触发进入阻塞状态,例如,控制台阻塞等待接收用户的输入。为了避免线程处于无休止的阻塞态,可以为其指定超时时长。

通过调用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: 结束
主线程结束

由以上结果可知,首先执行结束的是创建的第一个线程,其次执行结束是创建的第二个线程,以此类推,主线程最后执行结束。

点击此处
隐藏目录