違いはありますか
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(状況によっては便利です)。