42

に匿名クラスを使用したいRunnable。2 つの方法がありますが、同じことを行うかどうかはわかりません。

方法 1:Runnable直接使用してから呼び出すrun():

new Runnable() {
    @Override
    public void run() {
    }
}.run();

方法 2: の代わりにメソッドを使用して、匿名Runnableを作成し、に貼り付けます。Threadstart()run()

new Thread(new Runnable() {
    @Override
    public void run() {
    }
}).start();

方法2は明らかに正しいと思います。しかし、それが方法1と同じことをするかどうかはわかりません。run()メソッドをRunnable直接呼び出すことはできますか?

4

11 に答える 11

27

run()いいえ、通常、Runnableを直接呼び出すことはありません。その方法では、バックグラウンドスレッドが発生しないためです。バックグラウンドスレッドが不要で必要な場合は、run()直接呼び出しますが、バックグラウンドスレッドを作成し、その中からRunnableを実行する場合は、新しいスレッドを作成してから、Runnableをコンストラクターに渡す必要があります。 、およびを呼び出しますstart()

また、ExecutorsやExecutorServicesの使用など、このタスクを実行する方法は他にもあります。これらの使用法は、必要最低限​​のThreadオブジェクトを使用するよりも柔軟性とパワーを提供するため、検討する必要があります。

また、 RunnablesのようなFutureインターフェイスとFutureTasksクラスの使用法を確認する必要があります。これらは、完了時に結果を返すことができるという点だけです。SwingWorkerを使用したことがある場合は、気付かないうちにFutureインターフェースを使用していることになります。

于 2012-10-07T18:22:35.933 に答える
27

他の人が述べたように、Thread クラスを使用するのが正しい方法です。ただし、Javas Executorsフレームワークを使用して実行中のスレッドを処理することも検討する必要があります。

Executors.newSingleThreadExecutor().execute(new Runnable() {
    @Override 
    public void run() {
        // code in here
    }
});

もちろん、Thread を直接使用するだけでも問題ありません。ただし、一般的には、フレームワークを使用することをお勧め (または推奨) します。細かい部分は Java に任せてください。

于 2012-10-07T18:38:05.643 に答える
6

インターフェイスは 内で実行するRunnable必要がありますThread。インラインでラップする別の方法、つまり 内のコードのチャンクを見つけたい場合はThread、次を試してください。

Thread t = new Thread()
{
     public void run()
     {
        // put whatever code you want to run inside the thread here.
     }
};

t.start();
于 2012-10-07T18:29:47.847 に答える
4

この議論に何か追加したいと思います(すでに良い答えが得られています)。
Runnable オブジェクトがステートレスである場合、メモリ割り当てを減らすために (時間がかかり、メモリを消費します - アプリケーションがスレッドを大量に使用する場合を考えてください)、実行可能なオブジェクトを保持する静的フィールドを持つことを検討してください。

private static Runnable runnable = new Runnable() { //Once again - do this only if this is a statelss object!
   public void run() {
   }
} 

//Use the runnable somewhere in the code
于 2012-10-07T19:42:12.727 に答える
1

最初の方法は間違っています。新しいスレッドが作成されないため、役に立ちません。

これは、コードをランナブルの外に置くようなものです。

Threadのjavadocで説明されているように、匿名クラスで定義されたコードで新しいスレッドを起動する方法は2つありますが、メソッド1はその中にはなく、メソッド2が通常は好まれる方法です。

于 2012-10-07T18:22:40.707 に答える
1

@Hovercraft が言及しているように、Runnable.run()メソッドを直接呼び出すと、 aThreadはまったく作成されません。他のメソッド ( System.out.println(...), ...) を呼び出すのと同じです。

RunnableオブジェクトをThreadコンストラクターに渡すと、のtargetフィールドがオブジェクトに設定Threadされます。

this.target = target;

次に を呼び出すstart()Thread、新しいスレッドをフォークしてThread.run()メソッドを呼び出す作業が行われます。次にThread.run()、ターゲットのrun()メソッドを呼び出します。

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

したがって、Runnableを aThreadに渡してから呼び出すことは、別のスレッドでバックグラウンドでstart()実行する方法です。Runnable

于 2012-10-07T18:27:18.450 に答える
0

あなたの方法 1 は通常、有用な作業を行うことはできません。このメソッドでは、単純な HelloWorld.java プログラム、つまり「Hello World」の出力を取得したい場合、次の役に立たないコードのようになりますが、「Hello World」が出力されます。したがって、2 番目の方法を使用する必要があります。役に立たないコード:

class MyRunnable implements Runnable {

    public void run() { 
    System.out.println("Hello World");
    }

    public static void main(String[]arg){ 
    MyRunnable myRunnable = new NamedRunnable( );
    namedRunnable.run();
    } 
}
于 2017-06-24T15:47:23.013 に答える