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

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

  1. def print_number(num):
  2.  
  3. print("-----> %d" % num, time.ctime())
  4. time.sleep(5)
  5. print("print_number ending......", time.ctime())
  6.  
  7. def print_letter(letter):
  8.  
  9. print("-----> %s" % letter, time.ctime())
  10. time.sleep(10)
  11. print("print_letter ending......", time.ctime())
  12.  
  13. t1 = threading.Thread(target=print_number,args=(10,))
  14. t2 = threading.Thread(target=print_letter,args=('hello',))
  15.  
  16. if __name__ == '__main__':
  17. t1.start()
  18. t2.start()
  19.  
  20. print("Main thread ended...")

显示结果如下:

  1. -----> 10 Wed Mar 20 09:22:30 2019
  2. -----> hello Wed Mar 20 09:22:30 2019
  3. Main thread ended...
  4. print_number ending...... Wed Mar 20 09:22:35 2019
  5. print_letter ending...... Wed Mar 20 09:22:40 2019
  6.  
  7. ***Repl Closed***

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

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

  1. import threading
  2. import time
  3.  
  4. def print_number(num):
  5.  
  6. print("-----> %d" % num, time.ctime())
  7. time.sleep(5)
  8. print("print_number ending......", time.ctime())
  9.  
  10. def print_letter(letter):
  11.  
  12. print("-----> %s" % letter, time.ctime())
  13. time.sleep(10)
  14. print("print_letter ending......", time.ctime())
  15.  
  16. t1 = threading.Thread(target=print_number,args=(10,))
  17. t2 = threading.Thread(target=print_letter,args=('hello',))
  18.  
  19. if __name__ == '__main__':
  20. t1.start()
  21. t2.start()
  22.  
  23. t1.join()
  24.  
  25. print("Main thread ended...")

程序运行结果如下:

  1. -----> 10 Wed Mar 20 09:20:59 2019
  2. -----> hello Wed Mar 20 09:20:59 2019
  3. print_number ending...... Wed Mar 20 09:21:04 2019
  4. Main thread ended...
  5. print_letter ending...... Wed Mar 20 09:21:09 2019
  6.  
  7. ***Repl Closed***

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

线程中的join方法的更多相关文章

  1. 线程中的join方法,与synchronized和wait()和notify()的关系

    什么时候要用join()方法? 1,join方法是Thread类中的方法,主线程执行完start()方法,线程就进入就绪状态,虚拟机最终会执行run方法进入运行状态.此时.主线程跳出start方法往下 ...

  2. 模拟做饭系统(java+线程中的join方法)

    (一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...

  3. Java多线程中的join()方法

    一.join()方法介绍 join() 定义在Thread.java中.join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的join( ...

  4. Java并发编程--多线程中的join方法详解

    Java Thread中, join()方法主要是让调用该方法的thread在完成run方法里面的部分后, 再执行join()方法后面的代码 例如:定义一个People类,run方法是输出姓名年龄. ...

  5. Thread类中的join方法

    package charpter06; //类实现接口public class Processor implements Runnable { // 重写接口方法 @Override public v ...

  6. 线程中的join()

    http://blog.itpub.net/31555134/viewspace-2221319/ 一直对join()方法不是很理解,在A线程中, B线程调用了join()方法,然后在内部实际是wai ...

  7. 3-等待线程终止的join方法

    等待线程终止的join方法 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等. package com.heiye.learn1; public cl ...

  8. jQuery中的join方法

    和JS 中的JOIN 方法一样,将一数组按照JOIN的参数连接起来.比如: var arr = [ "a", "b", "c", " ...

  9. java线程学习之join方法

    join()方法表示一个线程要加入另一个线程,直到被加入的线程执行完毕. 这个概念不好理解的话看面这个例子 public class TestJoin { public static void mai ...

随机推荐

  1. task 异步 进程与线程的区别

    用Wait方法(会以同步的方式来执行),不用Wait则会以异步的方式来执行 要在主线程中等待后台线程执行完毕,可以使用Wait方法(会以同步的方式来执行).不用Wait则会以异步的方式来执行. Tas ...

  2. 爬虫之进阶 基于twisted实现自制简易scrapy框架(便于对scrapy源码的理解)

    1.调度器 class Scheduler(object): """调度器""" def __init__(self, engine): & ...

  3. TODO:BGP 建立过程

    //TODO: Quagga 实时监控配置文件

  4. python Selenium启动chromedriver

    从网上下载对应版本的chromedriver之后,里面的内容仅为一个.exe文件, 将其解压在chrome的安装目录下(C:\Program Files (x86)\Google\Chrome\App ...

  5. fiddler抓取https请求

    Fiddler抓取https设置详解(图文):https://www.cnblogs.com/joshua317/p/8670923.html Fiddler要抓取到https请求我们还需要Fiddl ...

  6. virtualenv+pyenv管理python工作环境

    因为python2与3之间存在差异,所以日常工作中可能需要在2与3之间来回切换.在相同的python版本中,有可能有的项目需要用到django1.8,别的项目需要用到django1.9,所以如果可以在 ...

  7. [Solution] 893. Groups of Special-Equivalent Strings

    Difficulty: Easy Problem You are given an array A of strings. Two strings S and T are special-equiva ...

  8. [Solution] 821. Shortest Distance to a Character

    Difficulty: Easy Problem Given a string S and a character C, return an array of integers representin ...

  9. 记第一次XSS实战

    前两天偶然挖到一个XSS,在我低谷期的时候给了我些动力,遂写下这篇博客记录 随手在一个搜索框中测试,发现有反应 观察一下标签,需要">把前面的闭合,然后<a 把后面的标签闭合 结 ...

  10. 利用ELK分析Nginx日志

    本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...