python3 线程 join_python 多线程 join start

python 多线程 join start

线程的几个状态初始(NEW):新创建了一个线程对象,但还没有调用START()方法。

运行(RUNNABLE):线程中将就绪(READY)和运行(RUNNING)两种状态笼统的称为“运行”。 线程对象创建后,其他线程(比如MAIN线程)调用了该对象的START()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(READY)。就绪状态的线程在获得CPU时间片后变为运行中状态(RUNNING)。

阻塞(BLOCKED):表示线程阻塞于锁。

等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。

终止(TERMINATED):表示该线程已经执行完毕。

python多线程的真相python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样

如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。

join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束。

如果线程daemon属性为True, 则join里的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。此处有一个坑,即如果同时有N个子线程join(timeout),那么实际上主线程会等待的超时时间最长为 N * timeout, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。

直接上代码#!/usr/bin/python

# -*- coding: utf-8 -*-

import threading

import time

def run():

time.sleep(26)

print('当前线程的名字是: ', threading.current_thread().name,time.time())

if __name__ == '__main__':

start_time = time.time()

print('这是主线程:', threading.current_thread().name)

thread_list = []

for i in range(5):

t = threading.Thread(target=run)

# 设置子线程为守护线程。守护线程,守护的为主线程,主线程一死则,守护线程活着没啥用,

# 所以主线程挂掉,守护主线程的守护线程也会跟着挂掉

t.setDaemon(True)

thread_list.append(t)

for t in thread_list:

# t.start() 只是把当前线程设置为就绪转态,就绪转态的意思就是当前线程已经准备就绪可以执行,但是不一定会立即执行

t.start()

# t.join() 就有点强制插队的感觉,意思就是我要插队,我要排到前面去,大家都暂停一下,包括主线程

t.join(5)

print('主线程结束!' , threading.current_thread().name)

print('一共用时:', time.time()-start_time)

你可能感兴趣的:(python3,线程,join)