zoukankan      html  css  js  c++  java
  • 【C/C++开发】多线程编程中的join函数

    多线程编程中的join函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # coding: utf-8
    # 测试多线程中join的功能
    import threading, time 
    def doWaiting(): 
        print 'start waiting1: ' + time.strftime('%H:%M:%S'+ " " 
        time.sleep(3
        print 'stop waiting1: ' + time.strftime('%H:%M:%S'+ " "
    def doWaiting1(): 
        print 'start waiting2: ' + time.strftime('%H:%M:%S'+ " "  
        time.sleep(8
        print 'stop waiting2: ', time.strftime('%H:%M:%S'+ " " 
    tsk = []   
    thread1 = threading.Thread(target = doWaiting) 
    thread1.start() 
    tsk.append(thread1)
    thread2 = threading.Thread(target = doWaiting1) 
    thread2.start() 
    tsk.append(thread2)
    print 'start join: ' + time.strftime('%H:%M:%S'+ " "  
    for tt in tsk:
        tt.join()
    print 'end join: ' + time.strftime('%H:%M:%S'+ " "

     

    Join的作用是众所周知的,阻塞进程直到线程执行完毕

     

    这个小程序使用了两个线程thread1和thread2,线程执行的动作分别是doWaiting()和doWaiting1(),函数体就是打印「开始」+休眠3秒+打印「结束」,分别附加上时间用来查看程序执行的过程。后面用start()方法同步开始执行两个线程。然后开始循环调用两个线程的join()方法,在此之前和之后都会用print函数做好开始结束的标记。我们主要观察for tt in tsk: tt.join()。

    join()不带参数的情况下,执行如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    start waiting1: 22:54:09
     
    start waiting2: 22:54:09
     
    start join: 22:54:09
     
    stop waiting1: 22:54:12
     
    stop waiting2:  22:54:17
     
    end join: 22:54:17
     
     
    Process finished with exit code 0

     

    可以看到,两个线程并行执行,进程1在3s后结束,进程2在8s后结束,然后回到主进程,执行打印「end join」。

    下面把参数设置成超时2s,即tt.join(2),执行如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    start waiting1: 22:54:57
     
    start waiting2: 22:54:57
     
    start join: 22:54:57
     
    stop waiting1: 22:55:00
     
    end join: 22:55:01
     
    stop waiting2:  22:55:05
     
     
    Process finished with exit code 0

    两个线程开始并发执行,然后执行线程1的join(2),等线程1执行2s后就不管它了,执行线程2的join(2),等线程2执行2s后也不管它了(在此过程中线程1执行结束,打印线程1的结束信息),开始执行主进程,打印「end join」。4s之后线程2执行结束。

    总结一下:

    1.join方法的作用是阻塞主进程(挡住,无法执行join以后的语句),专注执行多线程。

    2.多线程多join的情况下,依次执行各线程的join方法,前头一个结束了才能执行后面一个。

    3.无参数,则等待到该线程结束,才开始执行下一个线程的join。

    4.设置参数后,则等待该线程这么长时间就不管它了(而该线程并没有结束)。不管的意思就是可以执行后面的主进程了。

    最后附上参数为2时的程序执行流程表,自己画的orz,这样看起来更好理解。

  • 相关阅读:
    XmlReader和XElement组合之读取大型xml文档
    requestAnimationFrame/cancelAnimationFrame——性能更好的js动画实现方式
    webview的简单介绍和手写一个H5套壳的webview
    关于前后端写入Cookie时domain的一个问题
    vscode调试webpack的启动和打包部署过程,nodejs调试
    java 实现仿照微信抢红包算法,实测结果基本和微信吻合,附demo
    Java中的BigDecimal类和int和Integer总结
    @RequestParam和@RequestBody和@PathVariable用法小结
    spring-boot+spring-cloud+maven-module 一个 maven多模块的微服务架构模版
    SpringBoot + SpringCloud的爬坑之旅
  • 原文地址:https://www.cnblogs.com/huty/p/8517148.html
Copyright © 2011-2022 走看看