# 多线程python
# 一个进程至关于一个或多个线程编程
# 当没有多线程编程时,一个进程也是一个主线程多线程
# 但有多线程编程时,一个进程包含多个线程,包括主线程并发
# 使用线程 能够实现程序的并发函数
# python3中多多线程支持的是threading模块操作系统
# import threading线程
# 在python3中,能够经过两种方法来建立线程对象
'''
两种方法:继承
① 使用threading.Thread直接在线程中运行函数(调用Thread类的构造器建立线程)。生命周期
target参数:传入一个函数对象(函数名);
args参数:传入一个元组,做为目标函数的入参;
步骤以下:
1 - 调用Thread类的构造器建立线程对象,在建立对象时,target参数指定的函数将做为线程执行体
2 - 调用线程对象的star()方法启动该线程
② 继承Thread类建立线程类。
步骤以下:
1 - 定义Thread类的子类,并重写该类的run()方法,run()方法的方法体就表明了线程须要完成的任务,所以把run()方法称为线程执行体
2 - 建立Thread子类的实例,即建立线程对象
3 -调用线程对象的star()方法来启动线程
推荐使用第一种方式来建立线程,这种方式编程简单,线程直接包装target函数,具备更清晰的逻辑结构
'''
# 如何获取主线程的名称
# threading.current_thread().getName()
# 线程的调度方式
# start方法 启动线程
# join方法 等待线程
import threading
import time
def thread_run(name):
time.sleep(2)
print("%s first thread!!!" % name)
t1 = threading.Thread(target=thread_run, args=('peiyanan', ))
t2 = threading.Thread(target=thread_run, args=('tanyongling', ))
t1.start()
t2.start()
t1.setName('子线程1') # 设置线程的名称name
print(t1.name) # 打印线程名
print(t1.getName()) # 获取线程名称
print(t1.is_alive()) # isalive()方法用于判断线程是否运行 未运行会显示False
# t1.join()
# t2.join()
# print('主线程正在运行!!')
# -------------------------------------------------------
# 如何优雅的使用多线程
# 能够使用for循环来控制建立线程的数量
# menu = ['数学', '英语', '语文', '地理', '历史']
# for m in menu:
# t = threading.Thread(target=thread_run, args=(m, 2))
# t.start()
# 线程调度
# 操做系统不会让一个线程一直占用CPU的
# 线程的生命周期
'''
四个状态:
①新建状态 指该线程已经初始化,但还没启动
②运行状态 指线程的正常执行状态
③阻塞状态 指线程处于执行状态,但因为没有得到CPU的执行时间,而处在CPU外部等待线程执行的状态
④死亡状态 指线程执行结束
'''
# 使用线程须要注意到的点''' 线程独有的资源 调用的函数局部变量,线程都会有个本身的拷贝 不会冲突 线程有时会给开发上带来麻烦:如 共享数据的访问,好比全局变量'''