1. 程式人生 > 其它 >[原始碼解析]PyTorch如何實現前向傳播(1) --- 基礎類(上)

[原始碼解析]PyTorch如何實現前向傳播(1) --- 基礎類(上)

1、sleep()

使當前執行緒(即呼叫該方法的執行緒)暫停執行一段時間,讓其他執行緒有機會繼續執行,但它並不釋放物件鎖。注意該方法要捕捉異常。

例如有兩個執行緒同時執行(沒有synchronized)一個執行緒優先順序為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優先順序的執行緒執行完畢後,低優先順序的執行緒才能夠執行;但是高優先順序的執行緒sleep(500)後,低優先順序就有機會執行了。

總之,sleep()可以使低優先順序的執行緒得到執行的機會,當然也可以讓同優先順序、高優先順序的執行緒有執行的機會。

2、join()

join()方法使呼叫該方法的執行緒在此之前執行完畢,也就是等待該方法的執行緒執行完畢後再往下繼續執行。注意該方法也需要捕捉異常。

3、yield()

該方法與sleep()類似,只是不能由使用者指定暫停多長時間,並且yield()方法只能讓同優先順序的執行緒有執行的機會。

4、wait()和notify()、notifyAll()

這三個方法用於協調多個執行緒對共享資料的存取,所以必須在synchronized語句塊內使用。synchronized關鍵字用於保護共享資料,阻止其他執行緒對共享資料的存取,但是這樣程式的流程就很不靈活了。wait()方法使當前執行緒暫停執行並釋放物件鎖標示,讓其他執行緒可以進入synchronized資料塊,當前執行緒被放入物件等待池中。當呼叫notify()方法後,將從物件的等待池中移走一個任意的執行緒並放到鎖標誌等待池中,只有鎖標誌等待池中執行緒能夠獲取鎖標誌;如果鎖標誌等待池中沒有執行緒,則notify()不起作用。

notifyAll()則從物件等待池中移走所有等待那個物件的執行緒並放到鎖標誌等待池中。

注意 這三個方法都是Java.lang.Object的方法。

5、suspend()和resume()方法:

suspend()方法就是將一個執行緒掛起(暫停),resume()方法就是將一個掛起執行緒復活繼續執行。兩個方法配套使用,suspend()使得執行緒進入阻塞狀態,並且不會自動恢復,必須其對應的 resume()被呼叫,才能使得執行緒重新進入可執行狀態。典型地,suspend()和resume()被用在等待另一個執行緒產生的結果的情 形:測試發現結果還沒有產生後,讓執行緒阻塞,另一個執行緒產生了結果後,呼叫resume()使其恢復。但suspend()方法很容易引起死鎖問題, 已經不推薦使用了。

6、interrupt()方法

  interrupt字面上是中斷的意思,但在Java裡Thread.interrupt()方法實際上通過某種方式通知執行緒,並不會直接中止該執行緒。具體做什麼事情由寫程式碼的人決定,通常我們會中止該執行緒。