多线程threading模块的join()方法

join()方法

阻塞当前进程/线程,直到调用join方法的那个进程执行完,再继续执行当前进程。

join方法在java中即守护线程的概念:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

下面举例说明join()方法的作用。

  • eg1: 无join方法
import threading
from time import sleep, ctime

def world():

    for i in range(2):
        print "Hello World! " + ctime()
        sleep(2)

def ivanli():

    for i in range(2):
        print "Hello Ivanli! " + ctime()
        sleep(5)


def getThreads():

    threads = []
    t1 = threading.Thread(target=world)
    t2 = threading.Thread(target=ivanli)
    threads.append(t1)
    threads.append(t2)

    return threads

if __name__ == "__main__":

    threads = getThreads()
    for t in threads:
        t.start()

    print "main process .. "

输出:

Hello World! Wed Mar 21 21:40:32 2018
Hello Ivanli! Wed Mar 21 21:40:32 2018
main process .. 
Hello World! Wed Mar 21 21:40:34 2018
Hello Ivanli! Wed Mar 21 21:40:37 2018

Process finished with exit code 0

解释:
可见,无join方法,当线程t1和t2启动后,程序会将资源返回给主进程,主进程继续往下执行,所以执行了print,接着线程的sleep后,又再次循环一次执行了线程程序。

  • eg2: 有join方法,先start所有的线程,在join所有的线程
import threading
from time import sleep, ctime

def world():

    for i in range(2):
        print "Hello World! " + ctime()
        sleep(2)

def ivanli():

    for i in range(2):
        print "Hello Ivanli! " + ctime()
        sleep(5)


def getThreads():

    threads = []
    t1 = threading.Thread(target=world)
    t2 = threading.Thread(target=ivanli)
    threads.append(t1)
    threads.append(t2)

    return threads

if __name__ == "__main__":

    threads = getThreads()
    
    for t in threads:
        t.start()
        
    for t in threads:
        t.join()

    print "main process .. "

输出:

Hello World! Wed Mar 21 21:44:38 2018
Hello Ivanli! Wed Mar 21 21:44:38 2018
Hello World! Wed Mar 21 21:44:40 2018
Hello Ivanli! Wed Mar 21 21:44:43 2018
main process ..

解释:
可见,start所有的线程后,t1,t2同时启动,接着join所有的线程,阻塞当前进程,控制权不交给主进程,仍然在线程中,等所有线程都执行完毕后,再交给主进程,执行主进程的程序print

  • eg3: 有join方法,start1个线程,紧接着join该线程,再start另一个线程,再join另一个线程
import threading
from time import sleep, ctime

def world():

    for i in range(2):
        print "Hello World! " + ctime()
        sleep(2)

def ivanli():

    for i in range(2):
        print "Hello Ivanli! " + ctime()
        sleep(5)


def getThreads():

    threads = []
    t1 = threading.Thread(target=world)
    t2 = threading.Thread(target=ivanli)
    threads.append(t1)
    threads.append(t2)

    return threads

if __name__ == "__main__":

    threads = getThreads()

    for t in threads:
        t.start()
        t.join()

    print "main process .. "

输出:

Hello World! Wed Mar 21 21:46:23 2018
Hello World! Wed Mar 21 21:46:25 2018
Hello Ivanli! Wed Mar 21 21:46:27 2018
Hello Ivanli! Wed Mar 21 21:46:32 2018
main process .. 

解释:
可见,start t1线程后,紧接着就join守护t1线程,所有控制权在t1线程手上,只到t1线程结束,再start t2线程。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 3,086评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,574评论 1 15
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 7,457评论 3 87
  • 昨晚睡觉的时候,突然感觉口腔沉闷,而且干燥得发疼。我原以为是在做梦,所以无心理会。等到凌晨两点,我确确实实清醒过来...
    有一人焉阅读 433评论 0 2
  • 伤痛, 没有尽头 因为思念的风 一直吹荡在心头 用泪光可以筑一条通道吗 让我 重回 有你的日子
    木心幽兰阅读 301评论 0 3

友情链接更多精彩内容