2012-03-15 7 views
0

このプログラムの出力は「スレッド内のスレッドの中」となっていますが、どうしていますか?複数のスレッドからの出力を説明します

class MyThread extends Thread 
{ 
    MyThread() {} 
    MyThread(Runnable r) {super(r); } 
    public void run() 
    { 
     System.out.print("Inside Thread "); 
    } 
} 
class MyRunnable implements Runnable 
{ 
    public void run() 
    { 
     System.out.print(" Inside Runnable"); 
    } 
} 
class ThreadRunnableBoth 
{ 
    public static void main(String[] args) 
    { 
     new MyThread().start(); 
     new MyThread(new MyRunnable()).start(); 
    } 
} 

私は「インサイドのRunnable」を印刷するには期待していたが、それはこれが起こっているか、「インサイドスレッド」を印刷しますどのように最初の「スレッド内で」印刷されているがために二回目の印刷理解することができますか? 説明していただきありがとうございます.....

答えて

1

java.lang.Threadrun()方法は、単にtarget建設中に提供Runnableあるtarget.run()を呼び出します。ただし、MyThreadでは、この機能をオーバーライドしています。あなたのバージョンrun()はターゲットを無視し、代わりに "Inside Thread"を印刷します。それを修正するために

一つの方法は、基本Threadクラスのインスタンスを使用してRunnableを実行することです:

new Thread(new MyRunnable()).start(); 

他の可能性はないrun()を上書きするために、またはあなたのオーバーライドからsuper.run()を呼び出すことだろう。

+0

お返事ありがとうございます、私は今、ポイントを得ました... – Jayesh

1

MyThreadクラスでは、run()メソッドをオーバーライドしています。つまり、Runnableをコンストラクタに渡しても、実行メソッドが呼び出され、Runnableのターゲットは無視されます。

は、ここでは、上書きされThread.run()メソッドのコードです:

public void run() { 
    if (target != null) { 
     target.run(); 
    } 
} 

あなたは私がしたいあなたの実行可能なを使用する場合:

MyThreadクラスを使用していません
new Thread(new MyRunnable()).start(); 

0
new MyThread().start(); 

この場合、スレッドは、MyThreadクラスのrun()メソッドをMyThread(){}コンストラクタを呼び出して作成します。

2番目のケースでは、MyThread(Runnable)コンストラクタを使用して同じMyThreadクラスのrun()メソッドを呼び出すスレッドが作成されます。

1

次のようにThreadrunメソッドが定義されています

public void run() { 
    if (target != null) { 
    target.run(); 
    } 
} 

あなたはMyThreadrunをオーバーライドしてきたので、それは実際にあなたのMyRunnableを呼び出すことはありません。

あなたが期待している動作を取得するには:

new MyThread().start(); 
new Thread(new MyRunnable()).start(); 
+0

説明のために多くのおかげで – Jayesh

0

変更2回目の呼び出しは、スレッドには:カスタムスレッドも、あなたは通過した後に呼び出されるrunメソッドをオーバーライドし

new Thread(new MyRunnable()).start 

ので、コンストラクタをスレッド化するための実行可能ファイル

関連する問題