2016-07-27 66 views
0

我知道有兩種方式可以創建一個新的線程,由實現Runnable接口擴展線程類。我寫了一個實現Runnable接口的簡單程序。線程名稱與執行Runnable和擴展線程類

public class tp implements Runnable { 

    public void run() { 
     System.out.println("Hello from "+ Thread.currentThread().getName()); 
    } 

    public static void main(String args[]) { 
     tp o1= new tp(); 
     Thread t1 = new Thread(o1); 
     Thread t2 = new Thread(o1); 
     System.out.println(Thread.currentThread().getName()); 
     t1.start(); 
     t2.start(); 
     //(new Thread(new tp())).start(); 
    } 

} 

它具有以下輸出:

main 
Hello from Thread-0 
Hello from Thread-1 

然後我擴展類。

public class tp extends Thread { 

    public void run() { 
     System.out.println("Hello from "+ Thread.currentThread().getName()); 
    } 

    public static void main(String args[]) { 
     tp o1= new tp(); 
     Thread t1 = new Thread(o1); 
     Thread t2 = new Thread(o1); 
     System.out.println(Thread.currentThread().getName()); 
     t1.start(); 
     t2.start(); 
     //(new Thread(new tp())).start(); 
    } 

} 

其產生這樣的輸出:

main 
Hello from Thread-1 
Hello from Thread-2 

我不明白爲什麼線程的名字開始與線程0,當我實現的接口,並與線程1時,我伸出一個Thread類。

+1

請注意,只有一種方法來創建一個線程,這是實例'線程'和'啓動'實例。 –

+1

你描述的兩件事情_implementing'Runnable'接口和擴展'Thread' class_是定義執行線程行爲的方法。你的代碼片段都是第一種方法的例子,__plementationing'Runnable'_。雖然你已經擴展了'Thread',你只是使用子類型的一個實例作爲'Runnable'作爲'Thread'構造函數的第一個參數。爲了實現你描述的第二種方法,你必須'開始''tp'實例。 'o1.start()'。 –

+1

不依賴於唯一以外的線程號。 – BevynQ

回答

0

在第二個示例中,tp類調​​用其父構造函數。由於其父項爲Thread,因此main +中的tp對象會獲得第一個自動分配名稱(Thread-0)。

您不應該依賴自動生成的名稱。如果某個名字對您很重要,請致電Thread constructor that allows you to set your own name

+附註:請不要將與名稱相同的類和變量命名爲引入歧義。