zoukankan      html  css  js  c++  java
  • 线程中的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执行结束,主线程才会执行最后一行代码。

  • 相关阅读:
    mysql详解9:触发器和事件
    mysql详解7:视图
    mysql详解6:字符串函数 日期函数 IF CASE
    mysql详解5:复杂查询
    [转]Kubernetes网络组件之Calico策略实践(BGP、RR、IPIP)
    Springcloud 学习笔记05-Mybatis-Plus
    Git学习笔记04--tortoisegit的clone、pull、commit操作、分支的新增、合并、删除
    Git学习笔记03--Git客户端(TortoiseGit)安装与基本使用
    Java 项目bug记录过程--Failed to configure a DataSource
    TiDB学习笔记02-场景案例综述
  • 原文地址:https://www.cnblogs.com/guyexiangyun/p/10563133.html
Copyright © 2011-2022 走看看