判断Threading.start新线程是否执行完毕的实例
作者:福斯基 发布时间:2023-06-18 16:43:25
新写自己的Threading类
class MyThread(threading.Thread):#我的Thread类 判断流程结束没 用于os shell命令是否执行判断
def __init__(self,func = ""):#输入待执行函数名 我执行的函数没有参数就没有加args输入了
threading.Thread.__init__(self)
self.func = func
self.result = 1#未完成为1 标志位
#调用start自动执行的函数
def run(self):
self.result = self.func()
self.result = 0#完成返回0
然后执行
class MyThread(threading.Thread):#我的Thread类 判断流程结束没 用于os shell命令是否执行判断
def __init__(self,func = ""):#输入待执行函数名 我执行的函数没有参数就没有加args输入了
threading.Thread.__init__(self)
self.func = func
self.result = 1#未完成为1 标志位
#调用start自动执行的函数
def run(self):
self.result = self.func()
self.result = 0#完成返回0
这样就可以判断os.sysytem里语句是否执行完成是否
补充知识:python的threading.Thread线程的start、run、join、setDaemon
Pycharm整体看下Thread类的内容:模拟的是Java的线程模型
表示方法method,上面的锁头表示这个是类内部的方法,从方法名字命名规范可以看出,都是_和__开头的,一个下划线表示是子类可以继承,两个下划线表示是只有Thread内部可以访问,子类都不可以访问。
表示property,可以使用类直接访问:Thread._block
表示field,就是self.x定义的东东
表示变量variable
name/getName/setName是线程名字有关的;
isDaemon是否是守护进程
setDaemon设置为守护进程,如果把调用线程设置为守护线程,那么等调用线程结束后,被调用的子线程结束与否都会随着守护线程结束
isAlive线程是否是活动状态
start方法开启一个新线程。把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法。
run线程实际在运行的内容,可以被子类继承和重写overide。
join阻塞调用它的线程,直到等待被调用的线程运行结束,其实就变成了单线程。参数timeout的作用是,当前线程等待被调用的子线程的时间,如果时间到了,不管子线程是否结束,当前线程都进入就绪状态,重新等待CPU调度。
Join方法的Java示例:
新建一个Thread类,重写run()方法:
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("子线程执行完毕");
}
}
新建测试类,测试Join()方法:
public class TestThread {
public static void main(String[] args) {
//循环五次
for (int i = 0; i < 5; i++) {
MyThread thread = new MyThread();
//启动线程
thread.start();
try {
//调用join()方法
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程执行完毕");
System.out.println("~~~~~~~~~~~~~~~");
}
}
}
输出结果如下:
子线程执行完毕
主线程执行完毕
~~~~~~~~~~~~~~~
子线程执行完毕
主线程执行完毕
~~~~~~~~~~~~~~~
子线程执行完毕
主线程执行完毕
~~~~~~~~~~~~~~~
子线程执行完毕
主线程执行完毕
~~~~~~~~~~~~~~~
子线程执行完毕
主线程执行完毕
~~~~~~~~~~~~~~~
结果分析: 子线程每次都在主线程之前执行完毕,即子线程会在主线程之前执行。
什么时候用join()方法?
在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程随即终止。
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法
可见join和setDaemon作用是相反的,一个是等待子线程结束,一个是不等到子线程结束,有可能把子线程强制结束。如果两个都不设置的时候,那么主线程和子线程各自运行各自的,互不干扰,谁结束都不会影响另一个运行情况:见https://www.jb51.net/article/185872.htm示例
来源:https://blog.csdn.net/cool_bot/article/details/89678392


猜你喜欢
- Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都需要
- 一、概念介绍矩形树图(Treemap),即矩形式树状结构图,利用矩形的面积表示数值的大小,颜色用于类别区分,常用于呈现多类别的一维数值比较,
- 在前面的章节中,我们讨论了Series的计算方法与Pandas的自动对齐功能。不光是Series,DataFrame也是支持运算的,而且还是
- Python在读取文件内容时的路径问题,值得深究一下.我想讨论的重点还是在绝对路径上面.在这之前我们先看一下1:相对路径这张图演示了在相对路
- 一、相同点dump 和 dumps 都实现了序列化load 和 loads 都实现反序列化变量从内存中变成可存储或传输的过程称之为序列化序列
- php数组中元素的存在方式是以键值对的方式('key'=>'value'),有时候我们需要根据键删除数
- dlib包安装失败 python安装dlib时报错:Running setup.py install for dlib &helli
- 创建一个dataframe结构import pandas as pddf = pd.DataFrame( data
- 特点这是分类算法贝叶斯算法的较为简单的一种,整个贝叶斯分类算法的核心就是在求解贝叶斯方程P(y|x)=[P(x|y)P(y)]/P(x)而朴
- 今天真的被编码问题一直困扰着,午休都没进行。也真的见识到了各种编码。例如:gbk,unicode、utf-8、ansi、gb2312等。如果
- 最近,找到了一种新的pycharm激活方法,支持Jetbrains全家桶,比如 idea、pychram、WebStorm等等,没得zhil
- Git是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。Git 最初是由Linus Torvalds设计开发
- 匹配开头结尾字符功能^匹配字符串开头$匹配字符串结尾示例1:$需求:匹配163.com的邮箱地址email_list = [ "
- 在keras中,数据是以张量的形式表示的,不考虑动态特性,仅考虑shape的时候,可以把张量用类似矩阵的方式来理解。例如[[1],[2],[
- 这篇文章主要介绍了Python tkinter三种布局实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 本文为大家分享了网易2016研发工程师编程题,供大家参考,具体内容如下'''[编程题] 奖学金时间限制:1秒空间限制
- 1、grid 布局说明:参数说明: sticky:在插件正常尺寸下,分配单元中多余的空间(如果没有声明属性,默认插
- 一、简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装pyt
- 本文实例讲述了layer弹窗插件操作方法。分享给大家供大家参考,具体如下:1、首先去http://layer.layui.com/下载插件2
- SQL Server 获取数据的总记录数,有两种方式:1.先分页获取数据,然后再查询一遍数据库获取到总数量2.使用count(1) over