这个类表示在单独的控制线程中运行的活动。有两种方法可以指定这种活动,给构造函数传递回调对象,或者在子类中重写 run() 方法。其他方法(除了构造函数)都不应在子类中被重写。换句话说,在子类中只有 __init__() 和 run() 方法被重写。
一旦线程对象被创建,它的活动需要通过调用线程的start()方法来启动。这方法再调用控制线程中的run方法。
一旦线程被激活,则这线程被认为是'alive'(活动)。当它的run()方法终止时-正常退出或抛出未处理的异常,则活动状态停止。 isAlive() 方法测试线程是否是活动的。
一个线程能调用别的线程的 join() 方法。这将阻塞调用线程,直到拥有 join() 方法的线程的调用终止。
线程有名字。名字能传给构造函数,通过 setName() 方法设置,用 getName() 方法获取。
线程能被标识为'daemon thread'(守护线程).这标志的特点是当剩下的全是守护线程时,则python程序退出。它的初始值继承于创建线程。这标志用 setDaemon() 方法设置,用 isDaemon() 获取。
存在'main thread'(主线程),它对应于Python程序的初始控制线程。它不是后台线程。
有可能存在'dummy thread objects'(哑线程对象)被创建。这些线程对应于'alien threads'(外部线程),它们在Python的线程模型之外被启动,像直接从C语言代码中启动。哑线程对象只有有限的功能,它们总是被认为是活动的,守护线程,不能使用 join() 方法。它们从不能被删除,既然它无法监测到外部线程的中止。
class Thread( group=None, target=None, name=None, args=(), kwargs={} )构造函数能带有关键字参数被调用。这些参数是:
group 应当为 None,为将来实现 ThreadGroup 类的扩展而保留。
target 是被 run() 方法调用的回调对象. 默认应为None, 意味着没有对象被调用。
name 为线程名字。默认,形式为'Thread- N '的唯一的名字被创建,其中 N 是比较小的十进制数。
args 是目标调用参数的tuple,默认为()。
kwargs 是目标调用的参数的关键字dictionary,默认为{}。
如果子线程重写了构造函数,它应保证调用基类的构造函数 (Thread.__init__()) ,在线程中进行其他工作之前。
start() 启动线程活动。在每个线程对象中最多被调用一次。它安排对象的 run() 被调用在一单独的控制线程中。
run()
用以表示线程活动的方法。你可能在子类重写这方法。标准的 run() 方法调用作为 target 传递给对象构造函数的回调对象。如果存在参数,一系列关键字参数从 args 和 kwargs参数相应地起作用。
join([ timeout ]) 等待至线程中止。这阻塞调用线程直至线程的 join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。当 timeout 参数未被设置或者不是 None ,它应当是浮点数指明以秒计的操作超时值。因为 join() 总是返回 None ,你必须调用 isAlive() 来判别超时是否发生。
当 timeout 参数没有被指定或者是 None 时,操作将被阻塞直至线程中止。
线程能被 join()许多次。
线程不能调用自身的 join(),因为这将会引起死锁。
在线程启动之前尝试调用 join() 会发生错误。
getName() 返回线程名。 setName( name ) 设置线程名。这名字是只用来进行标识目的的字符串。它没有其他作用。多个线程可以取同一名字。最初的名字通过构造函数设置。
isAlive() 返回线程是否活动的。大致上,线程从 start() 调用开始那点至它的 run() 方法中止返回时,都被认为是活动的。模块函数 enumerate()返回活动线程的列表。
isDaemon() 返回线程的守护线程标志。 setDaemon( daemonic ) 设置守护线程标志为布尔值 daemonic 。它必须在 start() 调用之前被调用。初始值继承至创建线程。
当没有活动的非守护线程时,整个Python程序退出。