一、线程的实例化方法
1.通过函数方式:
threading模块中的Thread类有一个target参数,需要指定一个函数对象,创建的函数就是实现子线程的逻辑
2.通过类方式
自定义一个类并继承threading.Thread类,重写run()方法实现子线程的逻辑
3.区别:如果子线程较多,通过面向对象的变成方式便于管理代码;如果子线程较少,可以直接通过函数方式
二、函数方式
1、进程之间会进行资源抢占,谁先抢到执行谁
2、主线程会在子线程执行结束后再结束
-
thead.join()方法:会使对应的子线程先完整执行完,再执行其他的子线程或主线程,但要注意其位置要紧跟thread.start()之后
-
thead.setDaemon()方法:守护线程,其参数为布尔值,不会等待子线程结束再执行其他的子线程或主线程,但要注意其位置必须要在thread.start()之前
-
thread.enumerate()方法:查看当前存活的线程个数
三、类方式
四、资源竞争
注:第一个进程中的num做完+1还没来得及给num赋值,就被第二个进程抢占,导致最终结果产生了错误。
五、互斥锁和死锁
5.1互斥锁
当多个线程⼏乎同时修改某⼀个共享数据的时候,需要进⾏