判断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的线程模型

判断Threading.start新线程是否执行完毕的实例

判断Threading.start新线程是否执行完毕的实例 表示方法method,上面的锁头表示这个是类内部的方法,从方法名字命名规范可以看出,都是_和__开头的,一个下划线表示是子类可以继承,两个下划线表示是只有Thread内部可以访问,子类都不可以访问。

判断Threading.start新线程是否执行完毕的实例 表示property,可以使用类直接访问:Thread._block

判断Threading.start新线程是否执行完毕的实例 表示field,就是self.x定义的东东

判断Threading.start新线程是否执行完毕的实例 表示变量variable

判断Threading.start新线程是否执行完毕的实例

name/getName/setName是线程名字有关的;

isDaemon是否是守护进程

setDaemon设置为守护进程,如果把调用线程设置为守护线程,那么等调用线程结束后,被调用的子线程结束与否都会随着守护线程结束

判断Threading.start新线程是否执行完毕的实例

isAlive线程是否是活动状态

start方法开启一个新线程。把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法。

判断Threading.start新线程是否执行完毕的实例

run线程实际在运行的内容,可以被子类继承和重写overide。

判断Threading.start新线程是否执行完毕的实例

join阻塞调用它的线程,直到等待被调用的线程运行结束,其实就变成了单线程。参数timeout的作用是,当前线程等待被调用的子线程的时间,如果时间到了,不管子线程是否结束,当前线程都进入就绪状态,重新等待CPU调度。

判断Threading.start新线程是否执行完毕的实例

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

标签:Threading,start,线程,执行
0
投稿

猜你喜欢

  • 详解Django将秒转换为xx天xx时xx分

    2023-06-14 22:52:12
  • 利用Seaborn绘制20个精美的pairplot图

    2023-08-15 20:09:15
  • 关于Dreamweaver乱码问题的解决方案

    2010-09-02 12:36:00
  • python3中dict(字典)的使用方法示例

    2022-06-14 11:44:39
  • python中的lambda表达式用法详解

    2022-12-01 17:33:57
  • python 动态调用函数实例解析

    2021-03-11 09:31:41
  • python 利用栈和队列模拟递归的过程

    2023-12-14 14:08:12
  • Python使用pyodbc访问数据库操作方法详解

    2021-08-02 19:12:29
  • springboot连接不同数据库的写法详解

    2024-01-26 21:35:28
  • Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法

    2022-11-29 08:22:38
  • pandas创建series的三种方法小结

    2023-02-28 20:59:23
  • Linux安装卸载Mysql数据库

    2011-01-29 16:45:00
  • 常用的Git便捷操作合集

    2022-02-19 08:16:47
  • Vue中列表渲染指令v-for的基本用法详解

    2024-05-28 15:52:06
  • 基于PHP选项与信息函数的使用详解

    2024-05-13 09:23:34
  • Python用户自定义异常的实现

    2023-06-10 10:06:40
  • Python 剪绳子的多种思路实现(动态规划和贪心)

    2021-07-03 18:43:41
  • GO语言入门学习之基本数据类型字符串

    2023-07-16 08:26:31
  • javascript语言结构小记(一)

    2024-05-08 09:39:42
  • vue前端开发keepAlive使用详解

    2024-05-02 16:33:52
  • asp之家 网络编程 m.aspxhome.com