2011-01-26 9 views
1

このコードは正常に動作していますが、スレッド(名前)の代わりに6行目のコンストラクタのThread(name)を使用すると、動作していません。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

+0

このスレッドを明確にして確認してください:http://stackoverflow.com/questions/541487/java-implements-runnable-vs-extends-thread – birryree

+1

スレッド興味深い、特にrun()メソッドのコードを読んでいるかもしれません。 –

答えて

3

書き込むnew Thread("somename")は、何もしないスレッドを作成します。
(あなたはそれを実行するために何を提供したことがないので)

6

にこのスレッドで2があります、

  1. サブクラスThreadrunを無効にして、あなたのsuのインスタンスを作成します:スレッドを作成する方法

  2. bclass Runnableを拡張し、あなたのコードは#2ん

それを「実行」にスレッドにそれを与える - あなたはそれを「実行」するスレッドにそれを与える必要がありますので、あなたは、Runnableを実施しました。

私は第六行の代わりに、Thread(this,name)でコンストラクタThread(name)を使用している場合、私がちょうど違いを知りたい機能していませんか?

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

    は、それが開始されたときに実行するためにあなたのRunnablethisを)与えられた新しいスレッドを作成します。

違いがあることです。

  • Thread t= new Thread(name);

    新しいスレッドを実行するための任意のRunnable与えられないで作成します。したがって、スレッドは開始時に何もしません。スレッドを作成するための実行可能なインタフェースを使用してウル

  • 0

    我々は、スレッドのコンストラクタで、その後、Runnableインタフェースを使用している場合、我々は実行可能なオブジェクトrefernceとthread.whenの名前を渡すuがスレッド(名前)を使用し、その呼び出されていないスタート()が、スレッド(これは、名前)を作成するとき、それは実行可能なスレッドの要件をfullfillし、start()を開始します。

    +0

    これを見てください:[良い回答を書く](http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) – mtk

    0

    異なるスレッドコンストラクタが何をしているのかについての簡単な(そして理解できる)誤解があります。問題の2つのコンストラクタがあります。

    1. Thread(Runnable, String)Stringに名前を割り当て、それがRunnableを実行する必要があることを指定し、Threadを作成します。

    2. Thread(String)は、特殊なマジック引数Thread (null, null, name)で一般コンストラクタを呼び出します。これにより、新しいThreadが作成されますが、Runnableは提供されず、Threadのメソッドが実行されます。その結果、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

    は、第一に、我々は、Thread(RunnableをR、文字列s)異なる目的対(文字列s)はスレッドを知っていたはずです。

    異なるが実行可能実装コンストラクタが、スレッド(RunnableをR、ストリングS)に、我々は、ブラケットにの "値" を送信スレッド(文字列S)()である我々はStringにスレッド名を与えますRunnableを実装しているスレッドコンストラクタに渡します。

    スレッド(Runnable r、String s)を介してRunnableを実装するのと同じコードです。

    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) 
    
    関連する問題