1. 主要方法
让所有的子线程都join()就可以了.
不用join()的时候是这样的
用了join()之后是这样的.
2. 案例一
(1)没有join
import threading, time
def fun():
print("线程开始")
print("我是线程%s" % threading.current_thread())
for i in range(10):
time.sleep(1)
print("线程结束")
if __name__ == '__main__':
t = threading.Thread(target=fun, name="TTY")
t.start()
# t.join()
print('我好了')
输出结果:
线程开始
我好了
我是线程<Thread(TTY, started 123145546027008)>
线程结束
用图像理解
紫色的是主线程
橙色是线程TTY
因为主线程提前结束所以 我好了 这句话先出现
最后才出现线程TTY的 线程结束
(2)加入join
import threading, time
def fun():
print("线程开始")
print("我是线程%s" % threading.current_thread())
for i in range(10):
time.sleep(1)
print("线程结束")
if __name__ == '__main__':
t = threading.Thread(target=fun, name="TTY")
t.start()
t.join()
print('我好了')
区别是加入了join
Join函数的文档解释是:一直等到线程结束
运行结果:
线程开始
我是线程<Thread(TTY, started 123145365737472)>
线程结束
我好了
主线程不会继续往前,而是等待,等到TTY结束再继续往前。所以看到结果“我好了”出现在最后
3. 案例二:python的线程等待
1线程等待(join方法)
- 在多线程的程序中往往一个线程要等待其他线程执行完毕才可以继续执行,这时就可以使用join 函数
- 使用方法
线程对象.join() 在一个线程代码中执行这条语句,当前的线程就会停止执行,一直等到指定对象结束后才会继续执行,(即这条语句启动阻塞与等待的作用)
- join(timeout=None) 参数 timeout 用于设置超时时间,单位秒,如果为None,则一直等待,直到结束
import threading
import time
values = []
# 线程体函数
def thread_body():
print(f'{threading.current_thread().name} 开始!')
for i in range(3):
print(f'{threading.current_thread().name} 执行!')
values.append(i)
# 线程休眠
time.sleep(3)
print(f'{threading.current_thread().name}结束!')
# 线程等待
if __name__ == '__main__':
# 创建线程对象
thread = threading.Thread(target=thread_body)
# 执行线程体
thread.start()
# 说明:在当前线程中(主线程)调用了join(),就以为着必须等待 thread 线程执行完毕,才会执行主线程。
# 现象:类似于将主线程阻塞了。
# thread.join()
thread.join()
print(f'values = {values}')
没调用此函数时,列表中增加不进去
Thread-1 (thread_body) 开始!values = []
Thread-1 (thread_body) 执行!
Thread-1 (thread_body) 执行!
Thread-1 (thread_body) 执行!
Thread-1 (thread_body)结束!
Process finished with exit code 0
线程等待案例
import threading
import time
def reading():
for i in range(3):
print(f'reading...',i)
time.sleep(2)
def thread_body():
thread = threading.Thread(target=reading)
thread.start()
thread.join()
if __name__ == '__main__':
print(f'{threading.current_thread().name}.开始!')
# 创建线程对象
thread = threading.Thread(target=thread_body)
#执行线程体
thread.start()
# 线程等待
thread.join()
print(f'{threading.current_thread().name}执行完毕!')
执行结果
MainThread.开始!
reading… 0
reading… 1
reading… 2
MainThread执行完毕!
Process finished with exit code 0