多线程的创建

# 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('主线程执行完成!')

 

posted @ 2019-08-26 21:33  橘子先生123  阅读(238)  评论(0编辑  收藏  举报