2014-07-11 64 views
2

好吧,我的問題聽起來很混亂,但實際上很簡單。 我有一個Runnable啓動另一個Runnable實例。 所以基本上:在Runnable中啓動Runnable?

runnable1 - > runnable2

是否runnable1活着,只要runnable2是活着還是不runnable1結束時runnable2開始?

Runnable runnable1; 
Runnable runnable2; 

runnable1 = new Runnable() 
    { 
     public void run() 
     { 
      runnable2 = new Runnable() 
      { 
       public void run() 
       { 
        //Code here 
       } 
      }; 
      (new Thread(runnable2)).start();//Now that runnable 2 is started, does runnable 1 temrinate?? 
     } 
    }; 

(new Thread(runnable1)).start();//This starts first 
+1

它會,如果你調用線程運行的runnable2 join(),否則不會 – white

+0

感謝您的及時響應。因此,如果我保持原樣,那麼runnable1會在啓動runnable2時立即終止? 對不起,只是雙重檢查。 – Aci89

+1

是的,這是正確的 – white

回答

4

簡短的回答是沒有。

長的答案。 線程獨立執行。 就像你有一個main方法,並且你在其中啓動了一個threadmain方法將會調用start並且continue線程將獨立運行。

如果您希望runnable1等到runnable2完成。在你可以使用join()

更清晰

「難道runnable1活着,只要runnable2是活着還是不 runnable1結束時runnable2開始?」

,要麼不正確取決於哪個線程首先獲得CPU時間。

+0

謝謝。非常清楚! – Aci89

4

A Thread獨立於啓動它的代碼。因此,在您的代碼中,即使runnable2仍在運行,執行runnable1Thread將在達到run()的末尾時停止。

如果這不是你想要的,那麼你應該在另一個線程上使用Thread.join()

1

不是一個答案(其他人已經這樣做了),但......

...你說「Runanble」但你的問題其實是關於線程。 Runnable是一個接口。如果一個對象實現了Runnable,它僅僅意味着該對象有一個public void run()方法。這並不意味着其他東西。如果它是一個你寫的類,那麼run()方法將完成你所寫的任務,僅此而已。

如果你給你的Runnable對象添加一個新的線程,然後你調用線程的start()函數,這就是事情變得有趣的地方。但在開始之前,重要的是要知道線程(小t)和Thread(大T)對象之間的區別。小T線程是通過程序代碼執行的獨立路徑。 big-T Thread是一個Java庫對象,可用於創建和管理一個小型線程。

直到調用t.start()之前,小t線程才存在。一旦它開始,它會做一些初始化,然後它會調用你的run()方法,然後如果你的run()方法返回,它會在它停止存在之前做一些清理。


正如其他答案已經提到的那樣,Java語言不能識別線程之間的任何類型的父/子關係。當某個線程對象t存在時,任何碰巧知道它的線程都可以通過調用t.join()來等待其線程死亡...

...或不是。這完全取決於你。如果您的代碼是爲尊重父母/子女關係而編寫的,則可以這樣做。這實際上是一種非常普遍的做法,但它不會被語言強加給你。