假設我有一個具有兩種方法的可運行類:
class ExampleClass implements Runnable {
public void shutdown()
{
currentThread().interrupt();
}
public void run(){
while(!currentThread().isInterrupted()){
System.out.println("thread is running...");
}
}
我去像這樣在某個地方實作這個類并將它傳遞給一個執行緒:
ExampleClass object = new ExampleClass();
Thread sideThread = new Thread( object, "Side Thread");
thread.start();
object.shutdown();
所有這些物件及其所有方法都將在 sideThread 上運行還是只是在側執行緒上運行物件的 run() 方法?
即,當我呼叫 shutdown() 時,它實際上會中斷 sideThread 還是只是在實體化物件的主執行緒上中斷?
uj5u.com熱心網友回復:
中沒有額外的魔法Runnable。AThread接受 aRunnable并run在新執行緒上呼叫其方法。故事結局。該物件上的任何其他方法都與 無關Thread。如果您想在呼叫執行緒和創建的執行緒之間提供更緊密的集成,則由您來設計。
uj5u.com熱心網友回復:
Silvio 說的是對的,任何執行緒都可以呼叫物件的任何方法,將 Runnable 傳遞給執行緒的建構式告訴執行緒執行該 Runnable 的 run 方法。如果你愿意,你可以將實作 Runnable 的同一個物件傳遞給幾個新執行緒,讓它們都運行它。這里沒有魔法。
當您呼叫 時Thread.currentThread(),將回傳正在執行代碼的執行緒。因此,由于您發布的代碼現在可以正常作業,如果 1) 執行緒 A 啟動一個新執行緒 B 傳入此 Runnable,然后 2) 執行緒 A 在 Runnable 上呼叫關閉,則結果是在執行緒 A 上設定了中斷標志,而不是在執行緒 B 上,即執行 run 方法的執行緒。可能不是你想要的。最好保留對新執行緒的參考,并在其上呼叫中斷。
每個執行緒都會為其生成一個名稱。嘗試添加一些行,例如:
System.out.println("thread=" Thread.currentThread().getName());
在您的代碼中,它將顯示正在執行的執行緒。您將看到執行 run 方法的新執行緒,以及運行關閉方法的創建新執行緒的執行緒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400895.html
