线程中的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执行结束,主线程才会执行最后一行代码。
线程中的join方法的更多相关文章
- 线程中的join方法,与synchronized和wait()和notify()的关系
什么时候要用join()方法? 1,join方法是Thread类中的方法,主线程执行完start()方法,线程就进入就绪状态,虚拟机最终会执行run方法进入运行状态.此时.主线程跳出start方法往下 ...
- 模拟做饭系统(java+线程中的join方法)
(一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...
- Java多线程中的join()方法
一.join()方法介绍 join() 定义在Thread.java中.join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的join( ...
- Java并发编程--多线程中的join方法详解
Java Thread中, join()方法主要是让调用该方法的thread在完成run方法里面的部分后, 再执行join()方法后面的代码 例如:定义一个People类,run方法是输出姓名年龄. ...
- Thread类中的join方法
package charpter06; //类实现接口public class Processor implements Runnable { // 重写接口方法 @Override public v ...
- 线程中的join()
http://blog.itpub.net/31555134/viewspace-2221319/ 一直对join()方法不是很理解,在A线程中, B线程调用了join()方法,然后在内部实际是wai ...
- 3-等待线程终止的join方法
等待线程终止的join方法 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等. package com.heiye.learn1; public cl ...
- jQuery中的join方法
和JS 中的JOIN 方法一样,将一数组按照JOIN的参数连接起来.比如: var arr = [ "a", "b", "c", " ...
- java线程学习之join方法
join()方法表示一个线程要加入另一个线程,直到被加入的线程执行完毕. 这个概念不好理解的话看面这个例子 public class TestJoin { public static void mai ...
随机推荐
- SpringMVC中的一些注解
@Controller:表明该类是一个Controller: @RequestMapping(参数) :为类或者方法定义一个url @RequestParam(value = "id&quo ...
- StringUtils.isEmpty StringUtils.isBlank
两个方法都是判断字符是否为空的.前者是要求没有任何字符,即str==null 或 str.length()==0:后者要求是空白字符,即无意义字符.其实isBlank判断的空字符是包括了isEmpty ...
- shell 启动和停止脚本
启动脚本 start_kmeans_v3.sh #!/bin/bash #用于kmeans_data_v3_hadle启动 ps -ef | grep kmeans_data_v3_hadle.py ...
- Tcp协议细节(三次握手,四次握手)
利用滑动窗口实现流量控制(让发送方的发送速率不要太快,让接收方来得及接收) (发送窗口的发送窗口不能超过接收方给出的接收窗口的数值) 拥塞控制 拥塞:在某段时间,对网络中某一资源的需求超过了该资源所能 ...
- sql yog出现2013错误
首先用telnet检查一下你的防火墙端口,如果连接失败,配置防火墙. 配置防火墙,开启3306端口 find -name iptables vim /etc/sysconfig/iptables -A ...
- django xadmin拓展User模型
django提供四种拓展模型的方法: 1.代理模型 2.Profile拓展模型User 3.AbstractBaseUser拓展模型User 4.AbstractUser拓展模型 之前想通过第四种方法 ...
- Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException
Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. M ...
- Struts2各个功能详解(2)-输入校验和拦截器
前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器. 一:输入校验 客户端校验进行基本校验,如检验非空字段 ...
- handle java
关于java中的引用 我觉得在"think in java"这本书里面讲得很好 在那本书里 他们把引用叫做"句柄"(Handle) java中就是用" ...
- FastDFS防盗链
FastDFS扩展模块内置了通过token来实现防盗链的功能.开启防盗链后,访问文件是需要在url中加两个参数:token和ts.ts为时间戳,token为系统根据时间戳和密码生成的信物.为了系统的安 ...