歡迎您光臨本站 註冊首頁

判斷Threading.start新執行緒是否執行完畢的例項

←手機掃碼閱讀     ljg58026 @ 2020-05-06 , reply:0

新寫自己的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作用是相反的,一個是等待子執行緒結束,一個是不等到子執行緒結束,有可能把子執行緒強制結束。如果兩個都不設定的時候,那麼主執行緒和子執行緒各自執行各自的,互不幹擾,誰結束都不會影響另一個執行情況。


[ljg58026 ] 判斷Threading.start新執行緒是否執行完畢的例項已經有357次圍觀

http://coctec.com/docs/program/show-post-233054.html