Skip to main content

Python 入门基础知识 - Thread对象中的方法

Python 入门基础知识 - Thread对象中的方法

Thread对象中的方法

在上一篇文章中,仅使用了Thread对象中的start方法,重载了Thread对象的run方法。当线程被运行时,将运行run方法。

Thread对象具有以下的几种方法。

1、join方法

如果一个线程或者在函数的执行过程中调用另一个线程,并且待其完成操作后才能执行,那么在调用线程时可以使用被调用线程的join方法。

方法的原型如下

join([timeout])

其参数函数如下。

timeout: 可选参数,线程运行的最长时间。

实例演示如下

import threading  # 导入threading模块
import time  # 导入time模块
class TestThread(threading.Thread):  # 通过继承Thread创建类
    def __init__(self, id):  # 初始化方法
        threading.Thread.__init__(self)  # 调用父类的初始化方法
        self.id = id
    def run(self):  # 重载run方法
        time.sleep(10)  # 使用time模块中的sleep方法让线程休眠10秒
        print('线程ID: %s' % self.id)
def testFunc():  # 定义线程
    t1.start()  # 运行线程
    for i in range(5):
        print(i)
t1 = TestThread(2)  # 生成TestThread对象
testFunc()  # 调用函数,运行线程

运行结果如下

0
1
2
3
4
线程ID: 2

从上面的结果看出,testFunc直接运行了,并没有等待线程完成

def secondTestFunc():
    t2.start()
    t2.join()
    for i in range(5):
        print(i)
t2 = TestThread(3)
secondTestFunc()

运行结果如下

线程ID: 3
0
1
2
3
4

从上面的结果看出,secondTestFunc等待线程完成后,在执行

2、isAlive方法

当线程创建后,可以使用Thread对象的isAlive方法查看线程是否运行。

实例演示如下

import threading
import time
class TestThread2(threading.Thread):
    def __init__(self, id):
        threading.Thread.__init__(self)
        self.id = id
    def run(self):
        time.sleep(5)
        print('当前线程ID: %s' % self.id)
t3 = TestThread2(4)
def thirdTestFunc():
    t3.start()  # 运行线程
    print(t3.isAlive())  # 打印线程状态
thirdTestFunc()  # 调用函数

运行结果如下

True # 线程状态
当前线程ID: 4 # 线程输出

3、线程名

当线程创建后可以设置线程名来区分不同的线程,以便对线程进行控制。线程名可以在类的初始化函数中定义,也可以使用Thread

对象setName方法设置线程名。使用Thread对象的getName方法可以获得线程名。

实例演示如下

import threading
class TestThread3(threading.Thread):
    def __init__(self, threadName):
        threading.Thread.__init__(self, name=threadName)
    def run(self):
        print(self.getName())
t1 = TestThread3('t1')
print(t1.getName())

运行后输出结果如下

t1
t1.setName('T1')
print(t1.getName())

运行后输出结果如下

T1
t2 = TestThread3('t2')
t2.start()
print(t2.getName())
t2.setName('T2')
print(t2.getName())

运行后输出如下

t2
t2
T2

4、setDaemon方法

在脚本运行过程中有一个线程,如果主线程又创建一个子线程,那么当主线程退出时,会检验子线程是否完成。如果子线程未完成,则

主线程会等待子线程完成后再退出。当需要主线程退出时,不管子线程是否完成都随主线程退出,则可以使用Thead对象的setDaemon

方法来设置。

代码示例如下

# _*_ coding: utf-8 -*-
# version 2.7.13
import threading
import time


class TestThread(threading.Thread):

    def __init__(self, thread_name):
        threading.Thread.__init__(self, name=thread_name)

    def run(self):
        time.sleep(10)
        print(self.getName())


def func1():
    t1.start()
    print('func1 done')


def func2():
    t2.start()
    print('func2 done')


t1 = TestThread('线程T1')
t2 = TestThread('线程T2')
t2.setDaemon(True)
func1()
func2()

运行后输出结果如下

func1 done
func2 done
线程T1

由于调用了线程t2的setDaemon方法,当主线程结束时,线程t2也跟着结束。因此t2还没有来得及打印自己的线程名,就结束了。

将脚本中的t2.setDaemon(True)删除后运行得到结果如下

func1 done
func2 done
线程T2
线程T1

修改后的脚本要等待所有子线程完成后才会退出,因此线程t1和t2都被执行完成。如果在交互式模式下运行改脚本,则不会有区别,

因为在交互模式下的主线程在退出Python时才终止。

实例环境声明

# _*_ coding: utf-8 -*-
# version 2.7.13
版权声明

版权声明

durban.zhang 创作并维护的 Walkerfree 博客采用 创作共用保留署名-非商业-禁止演绎4.0国际许可证。本文首发于 Walkerfree 博客(http://www.walkerfree.com/),版权所有,侵权必究。本文永久链接:http://www.walkerfree.com/article/75