问题由来
学习多线程中,实例代码中有使用join()这个函数。
# 引入互斥锁
threadLock = threading.Lock()
threads = []
# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# 开启新线程
thread1.start()
thread2.start()
# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)
# 等待所有线程完成
for t in threads:
t.join()
print "Exiting Main Thread"
此处代码有两处疑惑:
- 为什么要在线程start()了之后才加入线程列表?
- 还有就是为什么要使用join()来阻塞线程?
答疑1
在start前面还是后面append到列表是完全等价的。
因为你的程序(前面省略),等价于:
# 开启新线程
thread1.start()
thread2.start()
# 等待所有线程完成
thread1.join()
thread2.join()
print "Exiting Main Thread"
答疑2
线程有一个布尔属性叫做daemon。表示线程是否是守护线程,默认取否。
当程序中的线程全部是守护线程时,程序才会退出。只要还存在一个非守护线程,程序就不会退出。
主线程是非守护线程。
所以如果子线程的daemon属性不是True,那么即使主线程结束了,子线程仍然会继续执行。只有子线程的daemon属性是True时才需要用join