違いはありますか
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
対
obj.start()
どちらかを選択する利点はありますか?
違いはありますか
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
対
obj.start()
どちらかを選択する利点はありますか?
一般に、拡張するのではなく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()
はい、違いがあります。拡張するのではなく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();
との概念を必ず区別してくださいThread
。Runnable
前者は実際のシステムリソースへの重いハンドルです。後者はメソッドの単なるホルダーです。
Thread t = new Thread(obj);
取るRunnable obj
- 推奨される方法。
MyThread obj = new MyThread();
最近はextend
Thread
お勧めできません。
議論の詳細については、「ランナブルを実装する」と「スレッドを拡張する」を参照してください。
これはせいぜい紛らわしいようです。
Runnableインターフェースを実装したいのですが、そうすれば、そのオブジェクトをコンストラクターだけでなく、後でスレッドに送信するためにオブジェクトを使用Thread
するスレッドプールやエグゼキューターなどでも利用できるようになります。Runnable
オブジェクトはすでに Thread を拡張しているため、新しい Thread オブジェクトでラップする必要はありません。代わりに Runnable を実装する場合は、最初のアプローチが正しいでしょう。
new Thread(obj)
に委任Thread.run
しobj
ます。これは としてのみ使用obj
し、 としては使用しRunnable
ませんThread
。
MyRunnable obj = new MyRunnable();
Thread t = new Thread(obj);
t.start();
(コード内で) 2 つのスレッド (開始されているスレッドと開始されていないスレッド) をインスタンス化しているため、追加のスレッドの作成にはいくらかのコストがかかります。これとは別に、 runnable を使用したフォームは、Thread
をオーバーライドするためだけに拡張していないため、より良い設計につながりますrun
。
でロジックを実装していればRunnable
、 を使用できThreadFactory
、 のデフォルトの実装に縛られることはなくなりますThread
(状況によっては便利です)。