2

スレッドのstartメソッドをオーバーライドしてはいけないというのは静かなことですが、2つの異なる動作と混同されたときに、Javaを練習していました.....Threadクラスのstartメソッドをオーバーライドしようとしています。以下のコードは次のとおりです。

package myPackage;

public class MainThreadUsingThread extends Thread{  
    @Override  
    public void run() {  
        System.out.println("-run   in t1");  
        System.out.println("");  
    }  
    @Override  
    public void start() {

        System.out.println("in start in t1");
        super.start();
    }

    /*public static void main(String[] args) {
        System.out.println("hii");
        Thread t3=new Thread(new MainThreadUsingThread());
        t3.start();
    }*/
}

class A11 {  
    public static void main(String[] args) {  
        System.out.println("hii");  
        Thread t1=new Thread(new MainThreadUsingThread());  
        t1.start();
        Thread t2=new Thread() {
            @Override
            public void run() {  
                System.out.println("run in t2");  
            }  
            @Override
            public void start() {

                System.out.println("in start in t2");
                super.start();
            }
        };
        t2.start();
    }
}

スレッド「t2」の場合、オーバーライドされたstartメソッドを取得していますが、スレッド「t1」の場合は取得していません。Plzは私がこの混乱から抜け出すのを手伝ってくれます。

また、実行可能なインターフェイスの場合に同じことを行う方法はありますか(適切な方法でない限り、オーバーライドします)。

4

4 に答える 4

4

あなたが書くとき:

Thread t1=new Thread(new MainThreadUsingThread());

オブジェクトを Thread ではなく Runnable として使用してMainThreadUsingThreadおり (Thread は Runnable を実装しています)、その start メソッドは決して呼び出されません。

あなたが書く場合:

Thread t1 = new MainThreadUsingThread();

期待どおりの結果が得られるはずです。

于 2013-01-18T11:01:54.430 に答える
1

あなたが書いThread t1=new Thread(new MainThreadUsingThread());た t1 は のオブジェクトではありませんMainThreadingUsingThreadstart()newのメソッドを呼び出すだけで、Thread次に のrun()メソッドを呼び出しますMainThreadUsingThread

于 2013-01-18T11:05:06.850 に答える
1
Thread t1=new Thread(new MainThreadUsingThread());

あなたは(実装しているため)new MainThreadUsingThread()として使用されています。スレッドが実行されるため、オーバーライドされません。RunnableThreadRunnableRunnable.run()start

Thread.start呼び出されると、新しいスレッドが開始Thread.runされ、その新しいスレッドが呼び出されます。

これを行う必要があります:

Thread t1=new MainThreadUsingThread();

ではThread、そのrunメソッドは、そのRunnable構築に使用される を開始します。構築にThreadnoRunnableが使用されている場合は何もしません。を拡張ThreadしてオーバーライドThread.runすると、スレッドの動作が効果的に変更されます。

を使用するnew Thread(new MainThreadUsingThread())と、コンストラクターが効果的に呼び出さThread(Runnable target)れ、新しいThread. これを行うのと同じように:

Thread t1=new Thread((Runnable)(new MainThreadUsingThread()))
于 2013-01-18T11:02:14.900 に答える
0

2番目の質問に関して:

Thread クラスを拡張することはベスト プラクティスではありません。代わりに、Runnable インターフェイスを使用します。つまり、

Thread myThread = new Thread(new Runnable(){
   @Override
   public void run(){
   }
});

もちろん、これも最善の方法ではありません。ExecutorService を確認することを強くお勧めします。これにはプーリングなどのものが含まれているため、毎回新しいスレッドが作成されるわけではありません。ジョブを送信するだけで完了します。

また、Futures などもサポートしており、正しく使用すれば非常に洗練されたコードになります。

于 2013-01-18T11:08:23.493 に答える