0

違いはありますか

class MyThread extends Thread
{
}

MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()

obj.start()

どちらかを選択する利点はありますか?

4

6 に答える 6

5

一般に、拡張するのではなくThread、代わりに実装する必要がありますRunnable。その場合、例は次のようになります。

class MyRunnable implements Runnable {

   public void run() {
      // Whatever needs to be done.
   }
}

MyRunnable obj = new MyRunnable();
Thread t = new Thread(obj);
t.start()
于 2013-03-21T12:10:51.390 に答える
3

はい、違いがあります。拡張するのではなくThread、を使用する必要がありますnew Thread(myRunnable)。これは最初のアプローチに似ていますが、Runnableを実装する代わりに、スレッドを拡張する方法が誤っているだけです。だからこれを行う:

class MyRunnable implements Runnable {
   public void run() { ... }
}

Thread t = new MyThread(new MyRunnable());
t.start();

または、より便利なことに、

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

との概念を必ず区別してくださいThreadRunnable前者は実際のシステムリソースへの重いハンドルです。後者はメソッドの単なるホルダーです。

于 2013-03-21T12:11:05.587 に答える
2

Thread t = new Thread(obj);取るRunnable obj- 推奨される方法。

MyThread obj = new MyThread();最近はextend Thread勧めできません。

議論の詳細については、「ランナブルを実装する」と「スレッドを拡張する」を参照してください。

于 2013-03-21T12:10:35.467 に答える
1

これはせいぜい紛らわしいようです。

Runnableインターフェースを実装したいのですが、そうすれば、そのオブジェクトをコンストラクターだけでなく、後でスレッドに送信するためにオブジェクトを使用Threadするスレッドプールやエグゼキューターなどでも利用できるようになります。Runnable

于 2013-03-21T12:11:28.753 に答える
1

オブジェクトはすでに Thread を拡張しているため、新しい Thread オブジェクトでラップする必要はありません。代わりに Runnable を実装する場合は、最初のアプローチが正しいでしょう。

于 2013-03-21T12:09:17.320 に答える
1

new Thread(obj)に委任Thread.runobjます。これは としてのみ使用objし、 としては使用しRunnableませんThread

MyRunnable obj = new MyRunnable();
Thread t = new Thread(obj);
t.start();

(コード内で) 2 つのスレッド (開始されているスレッドと開始されていないスレッド) をインスタンス化しているため、追加のスレッドの作成にはいくらかのコストがかかります。これとは別に、 runnable を使用したフォームは、Threadをオーバーライドするためだけに拡張していないため、より良い設計につながりますrun

でロジックを実装していればRunnable、 を使用できThreadFactory、 のデフォルトの実装に縛られることはなくなりますThread(状況によっては便利です)。

于 2013-03-21T12:10:07.640 に答える