话不多说,直接开始吧????

调入模块:

import threading

threading的几个方法

创建线程对象:

t1 = threading.Thread(target=output, args=("小明",))

target : 线程所要执行的函数的名称
args :函数的参数

启动线程:

t1.start()

将线程设置为守护线程:

t1.setDaemon(True)

设置主线程等待子线程结束:

t1.join()

下面通过不同的实例来展示一下不同方法的作用

1.创建线程(非守护线程)

import threadingimport timeprint(time.asctime(time.localtime(time.time()))) #记录开始时间def output(hh):  #所要执行的函数print("nihao %s" % hh)time.sleep(2)print(time.asctime(time.localtime(time.time())))  #记录每个子线程结束的时间def main():  #创建6个子线程t1 = threading.Thread(target=output, args=("小明",))t2 = threading.Thread(target=output, args=("小红",))t3 = threading.Thread(target=output, args=("小刚",))t4 = threading.Thread(target=output, args=("小文",))t5 = threading.Thread(target=output, args=("小康",))t6 = threading.Thread(target=output, args=("小莉",))t1.start()t2.start()t3.start()t4.start()t5.start()t6.start()print("我要结束了哦")if __name__ == '__main__':main()

执行结果:

Fri Jun 12 17:24:56 2020nihao 小明nihao 小红nihao 小刚nihao 小文nihao 小康nihao 小莉我要结束了哦Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020Fri Jun 12 17:24:58 2020

这里可以看到,各个子线程执行完是在同一时间,从开始到结束用了2秒钟。(输出结果顺序混乱是多线程的正常现象)

要注意的是,主线程运行完之后并没有直接结束,而是等待各个子线程结束之后才结束,这是非守护线程的效果。

2.使用 .setDaemon(True) 创建守护线程

import threadingimport timeprint(time.asctime(time.localtime(time.time())))  #记录开始时间def output(hh):  #所要执行的函数print("nihao %s" % hh)time.sleep(2)print(time.asctime(time.localtime(time.time())))  #记录每个子线程结束的时间def main():  #创建6个子线程t1 = threading.Thread(target=output, args=("小明",))t2 = threading.Thread(target=output, args=("小红",))t3 = threading.Thread(target=output, args=("小刚",))t4 = threading.Thread(target=output, args=("小文",))t5 = threading.Thread(target=output, args=("小康",))t6 = threading.Thread(target=output, args=("小莉",))t1.setDaemon(True)t2.setDaemon(True)   #设置为守护进程t3.setDaemon(True)t4.setDaemon(True)t5.setDaemon(True)t6.setDaemon(True)t1.start()t2.start()t3.start()t4.start()t5.start()t6.start()print("我要结束了哦")if __name__ == '__main__':main()

执行结果:

Fri Jun 12 17:38:31 2020nihao 小明nihao 小红nihao 小刚nihao 小文nihao 小康nihao 小莉我要结束了哦

这里可以看到,当所有子线程都设置为守护线程时,主线程运行完之后就直接结束了,而没有等待子线程结束,导致子线程没有运行完。

3.使用 .join() 方法使主线程等待子线程结束

import threadingimport timeprint(time.asctime(time.localtime(time.time())))  #记录开始时间def output(hh):print("nihao %s" % hh)time.sleep(2)print(time.asctime(time.localtime(time.time())))  #记录每个子线程结束的时间def main():  #创建6个子线程t1 = threading.Thread(target=output, args=("小明",))t2 = threading.Thread(target=output, args=("小红",))t3 = threading.Thread(target=output, args=("小刚",))t4 = threading.Thread(target=output, args=("小文",))t5 = threading.Thread(target=output, args=("小康",))t6 = threading.Thread(target=output, args=("小莉",))t1.setDaemon(True)     t2.setDaemon(True)      t3.setDaemon(True)t4.setDaemon(True)t5.setDaemon(True)t6.setDaemon(True)t1.start()t2.start()t3.start()t4.start()t5.start()t6.start()t1.join()t2.join()t3.join()t4.join()t5.join()t6.join()print("我要结束了哦")if __name__ == '__main__':main()

执行结果:

Fri Jun 12 18:00:39 2020nihao 小明nihao 小红nihao 小刚nihao 小文nihao 小康nihao 小莉Fri Jun 12 18:00:41 2020Fri Jun 12 18:00:41 2020Fri Jun 12 18:00:41 2020Fri Jun 12 18:00:41 2020Fri Jun 12 18:00:41 2020Fri Jun 12 18:00:41 2020我要结束了哦

我们可以看到,当设置了主线程等待子线程结束,子线程都运行完之后主线程才运行完。

使用.join() 方法和直接创建非守护进程的区别是:

使用 .join() 方法,主线程会等待子线程都运行完之后才执行后面的语句,所以主线程结束时,子线程肯定是已经运行完的。

直接创建非守护进程,主线程和子线程会同时运行,如果主线程运行完早于子线程,这时主线程会等待子线程运行完之后才结束。

4.批量创建子线程

import threadingimport timeprint(time.asctime(time.localtime(time.time())))  #记录开始时间def output(hh):print("nihao %s" % hh)time.sleep(2)print(time.asctime(time.localtime(time.time())))  #记录每个子线程结束的时间if __name__ == '__main__':thread_list = []for i in range(10):t = threading.Thread(target=output,args=("帅哥",))t.start()thread_list.append(t)for thread in thread_list:thread.join()

执行结果:

Fri Jun 12 19:40:57 2020nihao 帅哥nihao 帅哥nihao 帅哥nihao 帅哥nihao 帅哥nihao 帅哥nihao 帅哥nihao 帅哥nihao 帅哥nihao 帅哥Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020Fri Jun 12 19:40:59 2020

所有子线程都是在同一时刻结束。

讲解的不正确的地方,还请大神指出,我们共同进步。????

©著作权归作者所有:来自51CTO博客作者小甜甜?的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 一次线上故障:数据库连接池泄露后的思考
  2. Java程序员必精通之—synchronized
  3. MySQL默认数据库介绍
  4. 技术问答-21 线程 进程
  5. 技术问答-15
  6. MySQL 5.7 新备份工具mysqlpump 使用说明 - 运维小结
  7. Java 线程池 ThreadPoolExecutor -01
  8. python使用协程并发
  9. 高并发第六弹:线程封闭(ThreadLocal)

随机推荐

  1. HTTP常见面试题
  2. XML+JSON面试题都在这里
  3. 财务自由之路
  4. 打包压缩加密备份_bash笔记6
  5. AJAX常见面试题
  6. 【不用框架】文件上传和下载
  7. AJAX入门这一篇就够了
  8. MyBatis之SqlSessions
  9. java8的一个新特性-Lambda表达式的详解(从
  10. HTTP触发Jenkins参数化构建