# 1.使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化,并调用实例化对象的 start 方法创建线程。
# 2.继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化,并调用其 start 方法创建线程。
"""
调用 Thread 类的构造器创建线程很简单,直接调用 threading.Thread 类的如下构造器创建线程:
__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)
上面的构造器涉及如下几个参数:
1.group:指定该线程所属的线程组。目前该参数还未实现,因此它只能设为 None。
2.target:指定该线程要调度的目标方法。
3.args:指定一个元组,以位置参数的形式为 target 指定的函数传入参数。元组的第一个元素传给 target 函数的第一个参数,元组的第二个元素传给 target 函数的第二个参数……依此类推。
4.kwargs:指定一个字典,以关键字参数的形式为 target 指定的函数传入参数。
5.daemon:指定所构建的线程是否为后代线程。
"""
#下面调用 Thread 类的构造器创建线程
import threading
# 定义一个普通的action函数,该函数准备作为线程执行体
def action(max):
for i in range(max):
# 调用threading模块current_thread()函数获取当前线程
# 线程对象的getName()方法获取当前线程的名字
print(threading.current_thread().getName() + " " + str(i))
# 下面是主程序(也就是主线程的执行体)
for i in range(50):
# 调用threading模块current_thread()函数获取当前线程
print(threading.current_thread().getName() + " " + str(i))#打印当前的主线程(MainThread)
if i == 20:
# 创建并启动第一个线程
t1 =threading.Thread(target=action,args=(50,),name='wzy')
t1.start()
# 创建并启动第二个线程
t2 =threading.Thread(target=action,args=(50,),name='hs')
t2.start()
print('主线程执行完成!')
"""
1.默认情况下,主线程的名字为 MainThread,用户启动的多个线程的名字依次为 Thread-1、Thread-2、Thread-3、...、Thread-n 等。
2.虽然上面程序只显式创建并启动了两个线程,但实际上程序有三个线程,即程序显式创建的两个子线程和主线程。前面己经提到,当 Python 程序开始运行后,
程序至少会创建一个主线程,主线程的线程执行体就是程序中的主程序(没有放在任何函数中的代码)
3.在进行多线程编程时,不要忘记 Python 程序运行时默认的主线程,
主程序部分(没有放在任何函数中的代码)就是主线程的线程执行体。
4.此时程序中共包含三个线程,这三个线程的执行没有先后顺序,它们以并发方式执行:
Thread-1 执行一段时间,然后可能 Thread-2 或 MainThread 获得 CPU 执行一段时间,
接下来又换其他线程执行,这就是典型的线程并发执行,
CPU 以快速轮换的方式在多个线程之间切换,从而给用户一种错觉,即多个线程似乎同时在执行。
"""
#2.通过继承Thread类来创建子线程
"""
通过继承 Thread 类来创建并启动线程的步骤如下:
定义 Thread 类的子类,并重写该类的 run() 方法。
run() 方法的方法体就代表了线程需要完成的任务,因此把 run() 方法称为线程执行体。
创建 Thread 子类的实例,即创建线程对象。
调用线程对象的 start() 方法来启动线程。
"""
import threading
# 通过继承threading.Thread类来创建线程类
class sThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.i = 0
# 重写run()方法作为线程执行体
def run(self):
while self.i < 100:
# 调用threading模块current_thread()函数获取当前线程
# 线程对象的getName()方法获取当前线程的名字
print(threading.current_thread().getName() + " " + str(self.i))
self.i += 1
# 下面是主程序(也就是主线程的执行体)
for i in range(100):
# 调用threading模块current_thread()函数获取当前线程
print(threading.current_thread().getName() + " " + str(i))
if i == 20:
# 创建并启动第一个线程
s1 = sThread()
s1.start()
# 创建并启动第二个线程
s2 = sThread()
s2.start()
print('主线程执行完成!')