判斷Threading.start新線程是否執(zhí)行完畢的實例
新寫自己的Threading類
class MyThread(threading.Thread):#我的Thread類 判斷流程結(jié)束沒 用于os shell命令是否執(zhí)行判斷 def __init__(self,func = ""):#輸入待執(zhí)行函數(shù)名 我執(zhí)行的函數(shù)沒有參數(shù)就沒有加args輸入了 threading.Thread.__init__(self) self.func = func self.result = 1#未完成為1 標志位 # 調(diào)用start自動執(zhí)行的函數(shù) def run(self): self.result = self.func() self.result = 0#完成返回0
然后執(zhí)行
class MyThread(threading.Thread):#我的Thread類 判斷流程結(jié)束沒 用于os shell命令是否執(zhí)行判斷 def __init__(self,func = ""):#輸入待執(zhí)行函數(shù)名 我執(zhí)行的函數(shù)沒有參數(shù)就沒有加args輸入了 threading.Thread.__init__(self) self.func = func self.result = 1#未完成為1 標志位 # 調(diào)用start自動執(zhí)行的函數(shù) def run(self): self.result = self.func() self.result = 0#完成返回0
這樣就可以判斷os.sysytem里語句是否執(zhí)行完成是否
補充知識:python的threading.Thread線程的start、run、join、setDaemon
Pycharm整體看下Thread類的內(nèi)容:模擬的是Java的線程模型
表示方法method,上面的鎖頭表示這個是類內(nèi)部的方法,從方法名字命名規(guī)范可以看出,都是_和__開頭的,一個下劃線表示是子類可以繼承,兩個下劃線表示是只有Thread內(nèi)部可以訪問,子類都不可以訪問。
表示property,可以使用類直接訪問:Thread._block
表示field,就是self.x定義的東東
表示變量variable
name/getName/setName是線程名字有關(guān)的;
isDaemon是否是守護進程
setDaemon設(shè)置為守護進程,如果把調(diào)用線程設(shè)置為守護線程,那么等調(diào)用線程結(jié)束后,被調(diào)用的子線程結(jié)束與否都會隨著守護線程結(jié)束
isAlive線程是否是活動狀態(tài)
start方法開啟一個新線程。把需要并行處理的代碼放在run()方法中,start()方法啟動線程將自動調(diào)用 run()方法。
run線程實際在運行的內(nèi)容,可以被子類繼承和重寫overide。
join阻塞調(diào)用它的線程,直到等待被調(diào)用的線程運行結(jié)束,其實就變成了單線程。參數(shù)timeout的作用是,當前線程等待被調(diào)用的子線程的時間,如果時間到了,不管子線程是否結(jié)束,當前線程都進入就緒狀態(tài),重新等待CPU調(diào)度。
Join方法的Java示例:
新建一個Thread類,重寫run()方法:
public class MyThread extends Thread { @Override public void run() { System.out.println("子線程執(zhí)行完畢"); } }
新建測試類,測試Join()方法:
public class TestThread { public static void main(String[] args) { //循環(huán)五次 for (int i = 0; i < 5; i++) { MyThread thread = new MyThread(); //啟動線程 thread.start(); try { //調(diào)用join()方法 thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主線程執(zhí)行完畢"); System.out.println("~~~~~~~~~~~~~~~"); } } }
輸出結(jié)果如下:
子線程執(zhí)行完畢 主線程執(zhí)行完畢 ~~~~~~~~~~~~~~~ 子線程執(zhí)行完畢 主線程執(zhí)行完畢 ~~~~~~~~~~~~~~~ 子線程執(zhí)行完畢 主線程執(zhí)行完畢 ~~~~~~~~~~~~~~~ 子線程執(zhí)行完畢 主線程執(zhí)行完畢 ~~~~~~~~~~~~~~~ 子線程執(zhí)行完畢 主線程執(zhí)行完畢 ~~~~~~~~~~~~~~~
結(jié)果分析: 子線程每次都在主線程之前執(zhí)行完畢,即子線程會在主線程之前執(zhí)行。
什么時候用join()方法?
在很多情況下,主線程生成并起動了子線程,如果子線程里要進行大量的耗時的運算,主線程往往將于子線程之前結(jié)束,但是如果主線程處理完其他的事務(wù)后,需要用到子線程的處理結(jié)果,也就是主線程需要等待子線程執(zhí)行完成之后再結(jié)束,這個時候就要用到j(luò)oin()方法了。
用start方法來啟動線程,真正實現(xiàn)了多線程運行,這時無需等待run方法體代碼執(zhí)行完畢而直接繼續(xù)執(zhí)行下面的代碼。通過調(diào)用Thread類的start()方法來啟動一個線程,這時此線程處于就緒(可運行)狀態(tài),并沒有運行,一旦得到cpu時間片,就開始執(zhí)行run()方法,這里方法 run()稱為線程體,它包含了要執(zhí)行的這個線程的內(nèi)容,run方法運行結(jié)束,此線程隨即終止。
run()方法只是類的一個普通方法而已,如果直接調(diào)用Run方法,程序中依然只有主線程這一個線程,其程序執(zhí)行路徑還是只有一條,還是要順序執(zhí)行,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼,這樣就沒有達到寫線程的目的。
總結(jié):調(diào)用start方法方可啟動線程,而run方法只是thread的一個普通方法調(diào)用,還是在主線程里執(zhí)行。把需要并行處理的代碼放在run()方法中,start()方法啟動線程將自動調(diào)用 run()方法
可見join和setDaemon作用是相反的,一個是等待子線程結(jié)束,一個是不等到子線程結(jié)束,有可能把子線程強制結(jié)束。如果兩個都不設(shè)置的時候,那么主線程和子線程各自運行各自的,互不干擾,誰結(jié)束都不會影響另一個運行情況:見http://www.dbjr.com.cn/article/185872.htm示例
以上這篇判斷Threading.start新線程是否執(zhí)行完畢的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python在Excel中添加數(shù)據(jù)條的代碼詳解
在Excel中添加數(shù)據(jù)條是一種數(shù)據(jù)可視化技巧,它通過條形圖的形式在單元格內(nèi)直觀展示數(shù)值的大小,尤其適合比較同一列或行中各個單元格的數(shù)值,本文將介紹如何使用Python在Excel中的指定單元格區(qū)域添加數(shù)據(jù)條,需要的朋友可以參考下2024-10-10Python實現(xiàn)批量繪制遙感影像數(shù)據(jù)的直方圖
這篇文章主要為大家詳細介紹了如何基于Python中g(shù)dal模塊,實現(xiàn)對大量柵格圖像批量繪制直方圖,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-02-02python3+PyQt5+Qt Designer實現(xiàn)界面可視化
本文主要介紹了python3+PyQt5+Qt Designer實現(xiàn)界面可視化,Qt Designer,用鼠標拖拖就能完成窗體設(shè)計,感興趣的可以了解一下2021-06-06