2011-01-26 80 views
1

此代碼工作正常,但如果我在第6行而不是線程(這,名稱)使用構造函數線程(名稱)它不工作我只是想知道是什麼使差異?使用Runnable和Thread創建線程的區別?

public class threadtest implements Runnable{ 
    Thread t; 

    public threadtest(String name) 
    { 
     System.out.println("satheesh"); 
     Thread t=new Thread(this,name); 
     t.start(); 
     t=null; 
     //System.out.println(this+"\n"+t); 
    } 

    public void run(){ 
     System.out.println("satheesh"); 
     for(int i=0;i<=10;i++) 
     { 
      try{ 
       System.out.println("satheesh"); 
       Thread.sleep(1000); 
       System.out.print(Thread.currentThread()); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 
     } 
    } 

    public static void main(String args[]) 
    { 
     threadtest ob=new threadtest("satheesh");  
    } 
} 
+1

你的問題就沒有意義了。 – SLaks 2011-01-26 15:31:09

+0

請澄清,並檢查此線程:http://stackoverflow.com/questions/541487/java-implements-runnable-vs-extends-thread – birryree 2011-01-26 15:31:51

+1

你可能會發現閱讀線程有趣的代碼,特別是run()方法。 – 2011-01-26 15:59:06

回答

3

new Thread("somename")創建一個不會做任何事情的線程。
(因爲你從來沒有提供任何東西它運行)

6

有兩家方法來創建一個線程:

  1. 子類Thread,覆蓋run,然後創建您的蘇實例bclass

  2. 擴展Runnable,並給它一個線程來「跑」它

您的代碼不會#2 - 你實現Runnable,所以你必須給它一個線程來「跑」了。

如果我使用6號線,而不是Thread(this,name)構造Thread(name)它不工作,我只是想知道是什麼使不同?

的不同之處在於:

  • Thread t= new Thread(this,name);

    創建一個被賦予了新的線程您Runnablethis),以在啓動時運行。

  • Thread t= new Thread(name);

    創建一個新的線程給予任何Runnable運行。所以線程在啓動時什麼也不做。

0

UR使用Runnable接口來創建線程,如果我們使用Runnable接口則在線程的構造函數,我們通過Runnable對象refernce和thread.when u使用線程(名稱)的名稱,它不是調用start(),但當你創建線程(這個名字)時,它滿足可運行線程的需求,並啓動start()。

0

對於不同的Thread構造函數的作用存在一個簡單的(而且可以理解的)誤解。有兩個構造問題:

  1. Thread(Runnable, String)創建Thread,它的名字分配給String,並指定它應該運行的Runnable

  2. Thread(String)調用具有特殊魔法參數Thread (null, null, name)的常規構造函數。這會創建一個新的Thread,但它將運行Thread中的方法,而不是任何提供的Runnable。因此,如果您致電t.start(),它將調用線程的run()方法。

所以,代碼簡單重寫得到你想要的東西:

public class threadtest extends Thread { // [sic] on the capitalization 

    public threadtest(String name) { 
     System.out.println("satheesh"); 
    } 

    public void run() { 
     System.out.println("satheesh"); 
     for(int i=0;i<=10;i++) { 
     try { 
      System.out.println("satheesh"); 
      Thread.sleep(1000); 
      System.out.print(Thread.currentThread()); 
     } catch(Exception e) { 
      System.out.println(e); 
     } 
    } 

    public static void main(String args[]) { 
     threadtest ob = new threadtest("satheesh"); 
     // The following will call the correct run method now 
     ob.start(); 
    } 

} 
0

月1日,我們應該知道線程(String s)將VS主題(Runnable的R,String s)將不同的目的。

不同的是線程(String s)將我們在支架()發送 「價值」到實現Runnable但線程(Runnable的R,String s)將我們給一個線程名到String構造s到實現Runnable的線程構造函數。

這裏是通過線程實現Runnable的相同代碼(Runnable r,String s)。

public class threadtest implements Runnable{ 
Thread t; 
threadtest th; 

public threadtest(){} 

public threadtest(String name) 
{ 
System.out.println("satheesh"); 
Thread t=new Thread(th, name); //satheesh,name of thread, gave to name 
t.start(); //2nd thread that will start run() method in void run() 
//t=null; 
//System.out.println(this+"\n"+t); 
} 
public void run(){ 
System.out.println("satheesh"); 
for(int i=0;i<=10;i++) 
{ 
try{ 
System.out.println("satheesh"); 
Thread.sleep(1000); 
System.out.print(Thread.currentThread()); 
} 
catch(Exception e) { System.out.println(e); } 
} 
} 
public static void main(String args[]){ 

//ob is Runnable object that will send his empty value() 
threadtest ob = new threadtest(); //to default constructor threadtest() above 

//satheesh is name of main thread that we will send to String name in Thread t=new Thread(th, name); 
Thread th = new Thread(ob, "satheesh"); 
th.start(); //1st thread that will instruct to send satheesh 
} 
} 

輸出:

satheesh 
satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
Thread[satheesh,5,main]satheesh 
BUILD SUCCESSFUL (total time: 11 seconds) 
相關問題