线程中的join方法

join方法的作用是同步线程。

1、不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退出。

def print_number(num):

    print("-----> %d" % num, time.ctime())
    time.sleep(5)
    print("print_number ending......", time.ctime())

def print_letter(letter):

    print("-----> %s" % letter, time.ctime())
    time.sleep(10)
    print("print_letter ending......", time.ctime())

t1 = threading.Thread(target=print_number,args=(10,))
t2 = threading.Thread(target=print_letter,args=('hello',))

if __name__ == '__main__':
    t1.start()
    t2.start()

    print("Main thread ended...")

显示结果如下:

-----> 10 Wed Mar 20 09:22:30 2019
-----> hello Wed Mar 20 09:22:30 2019
Main thread ended...
print_number ending...... Wed Mar 20 09:22:35 2019
print_letter ending...... Wed Mar 20 09:22:40 2019

***Repl Closed***

可以看到主线程、t1、t2同时开始执行,主线程仅打印了“Main thread ended...”,就执行完毕并退出;而程序等待t1和t2执行完毕后才退出。

 

2、使用join()方法:主线程主线程任务结束之后,进入阻塞状态,一直等待调用join方法的子线程执行结束之后,主线程才会终止。下面的例子是让t1调用join()方法。

import threading
import time

def print_number(num):

    print("-----> %d" % num, time.ctime())
    time.sleep(5)
    print("print_number ending......", time.ctime())

def print_letter(letter):

    print("-----> %s" % letter, time.ctime())
    time.sleep(10)
    print("print_letter ending......", time.ctime())

t1 = threading.Thread(target=print_number,args=(10,))
t2 = threading.Thread(target=print_letter,args=('hello',))

if __name__ == '__main__':
    t1.start()
    t2.start()

    t1.join()

    print("Main thread ended...")

程序运行结果如下:

-----> 10 Wed Mar 20 09:20:59 2019
-----> hello Wed Mar 20 09:20:59 2019
print_number ending...... Wed Mar 20 09:21:04 2019
Main thread ended...
print_letter ending...... Wed Mar 20 09:21:09 2019

***Repl Closed***

可以看到与无join方法时的输出顺序明显不同。t1、t2同时启动。而t1的时间短,因此在5秒钟之后该线程执行完毕。由于t1.join(),主线程在执行时,在调用t1.join()方法的地方被阻塞了,在此处一直等待t1执行结束,主线程才会执行最后一行代码。

转载于:https://www.cnblogs.com/guyexiangyun/p/10563133.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值