我在大學進行了一次測驗,告訴我修復下面的代碼,因此它在列印“END”之前等待執行緒完成。MyThread 的內容未知:
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.sleep(1000);
s2.sleep(1000);
System.out.println("END");
我最初的解決方案是 join() 2個執行緒,但這不起作用。
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.sleep(1000);
s2.sleep(1000);
s1.join();
s2.join();
System.out.println("END");
然后我嘗試通過 while 回圈檢查執行緒是否還活著。
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.sleep(1000);
s2.sleep(1000);
while(s1.IsAlive() || s2.IsAlive){
continue;
}
System.out.println("END");
但是這個也不起作用。顯然,正確的答案是加入執行緒并洗掉 2 個睡眠:
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.join();
s2.join();
System.out.println("END");
我的問題是:為什么我的答案都不能被接受?問我的實驗室負責人,但他不能給我答案。在家里對測驗進行編碼,它似乎作業得很好。在此先感謝您的幫助!
uj5u.com熱心網友回復:
解決方案join()肯定是正確的。如果我們查看官方檔案,我們可以看到以下內容...
public final void join (long millis) throws InterruptedException 最多等待 ms 毫秒讓該執行緒死亡。超時為 0 意味著永遠等待。此實作使用以 this.isAlive 為條件的 this.wait 呼叫回圈。當執行緒終止時,呼叫 this.notifyAll 方法。建議應用程式不要在 Thread 實體上使用 wait、notify 或 notifyAll
此方法專為處理此用例而設計。
您可能無法獲得預期結果的原因是t.sleep()您呼叫了對另一個執行緒的參考的呼叫,請參閱對原始帖子的評論之一。
uj5u.com熱心網友回復:
想象一下未來的場景:你現在在銀行作業,或者更糟的是在核電站作業。準確了解這些后臺任務何時完成的重要性要高得多。
請注意, sleep 是一個靜態方法,因此不應通過實體參考s1或s2- sleep 僅影響當前執行緒。
Thread.sleep(x)如果任務持續時間很短,則使用的解決方案可能看起來有效,但睡眠并不能保證操作已完成。如果每個 MyThread 需要 1 毫秒并且您的代碼被呼叫一百萬次怎么辦?使用sleep(1000)意味著您的程式將運行過長的時間而不知道交易肯定結束了。
解決方案while(s1.IsAlive()...可能看起來有效但失敗了,因為您的呼叫執行緒正在運行一個緊密的回圈。它將消耗過多的 CPU,因為它總是在其他任務正在運行時運行,因此這會損害為 MyThread 任務分配的 CPU。
正確答案使用Thread.join. 您的呼叫執行緒會阻??塞 - 不會浪費 CPU - 直到每個 MyThread 結束。經過的時間與它們的運行時間完全匹配,并且您知道 MyThreads 已結束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359335.html
上一篇:C 執行緒工廠
下一篇:python執行緒本地意外值
