2016-01-07 132 views
2

有一些我一般無法理解的線程。在我的情況下,使用Java和Android的 。線程內線程:如果父線程被終止會發生什麼?

比方說,我有一個名爲A的線程,它啓動線程B。如果線程A停止,則線程B將繼續存在。這怎麼可能?現在誰屬於線程B?到主線程?

Thread類

public class ParentThread extends Thread { 

    public void run(){ 
     Log.e("PARENT THREAD", "STARTS RUNNING"); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true) { 
        Log.e("CHILD THREAD", "IS ALIVE"); 
        try { 
         Thread.sleep(1000); 
        } 
        catch (InterruptedException exc) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 
     Log.e("PARENT THREAD", "STOPS RUNNING"); 
    } 
} 

活動

new ParentThread().start(); 

logcat的輸出

01-07 13:45:16.726 22063-22081/? E/PARENT THREAD: STARTS RUNNING 
01-07 13:45:16.726 22063-22081/? E/PARENT THREAD: STOPS RUNNING 
01-07 13:45:16.727 22063-22082/? E/CHILD THREAD: IS ALIVE 
01-07 13:45:17.727 22063-22082/? E/CHILD THREAD: IS ALIVE 
01-07 13:45:18.727 22063-22082/? E/CHILD THREAD: IS ALIVE 
01-07 13:45:19.727 22063-22082/? E/CHILD THREAD: IS ALIVE 
... 
+2

線程不相互「屬於」。他們甚至沒有父母。 – immibis

+0

當您使用流程時,而不是在使用線程時,您會發現此父/子所有權構造! – ParkerHalo

+0

是的,就像在C中使用'fork()'時一樣? – FrenchFalcon

回答

3

從文檔Thread

線程是併發執行單元。它對調用的方法,它們的參數和局部變量有自己的調用棧。每個應用程序至少有一個線程在啓動時運行,主線程位於主線程組中。運行時在系統線程組中保留自己的線程。

+0

這正是我想要的......我應該閱讀Android文檔。謝謝 ! – FrenchFalcon

2

比方說,我有一個名爲線程,如果線程A停止,線程B將繼續生活,會啓動線程B.。這怎麼可能?

這很容易 - 沒有什麼能讓線程B停下來,所以它不會停下來。

現在誰屬於線程B?到主線程?

線程不屬於對方。事實上,它是啓動線程B的線程A不會被記錄到任何地方 - 就係統而言,您有兩個線程,它們之間沒有任何關係。

+0

該答案有什麼問題? – FrenchFalcon

+0

@gio你確定你沒有不必要的敏感嗎? – immibis

+0

父母不好的例子 – gio