1. 程式人生 > 程式設計 >判斷Threading.start新執行緒是否執行完畢的例項

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

新寫自己的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示例

以上這篇判斷Threading.start新執行緒是否執行完畢的例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。