7

Thread クラスを拡張することの利点は何でしょうか?

これは、私が説明する別の質問の一部です: Java でスレッドを作成する方法は 2 つあります。

  1. Thread クラスからの拡張
  2. 実行可能なインターフェースの実装

ここで説明したよう、実行可能なインターフェースを使用することにはいくつかの利点があります。私の質問は、Thread クラスから拡張する利点は何ですか? 私の頭に浮かぶ唯一の利点は、Thread クラスから拡張できることです。それを ThreadExtended クラスと呼びましょう。次に、彼/彼女は ThreadExtended にさらに機能を追加できます (それが何であるかはわかりません)。次に、スレッドを作成したい場合は、Thread クラスから拡張するのではなく、ThreadExtended から拡張します。

Runnable インターフェイスの代わりに Thread クラスを使用する利点はありますか? Thread クラスから拡張され、マルチスレッド機能が必要な場合にそれらのクラスから拡張するようにユーザーに依頼するクラスを知っていますか?

    public class ThreadExtended extends Thread{
    //override some functions || add more functionality to Thread class
    }

    public class MyThread extends ThreadExtended{
     public void run()
    {
     for(int i=0;i<10;i++)
        {
          System.out.println("Using ThreadExtended instead of Thread directly");
        }
    }

    public static void main(String args[])
    {
    MyThread myThread = new MyThread();
    myThread.start();
    }
    }
4

5 に答える 5

9

Thread クラスを拡張するやむを得ない理由はめったにありません。とにかく、ほとんどの場合、「何らかの処理を行う」ロジックのすべてを実行メソッドに投げ込むことになると思います。

Runnable の実装に固執する必要があります。Thread を拡張することを選択すると、おそらく無意味なクラス階層が作成され、将来のリファクタリングのオプションが制限されることになります。Runnable の実装を選択することで、実装者の系統が何であるかを要求する必要がなくなり、ExecutorServiceのような強力な抽象化を使用して、コードのチャンクを実行するための基本的な作業を抽象化することができます。最後に、クラスを拡張するよりもインターフェイスを実装することをお勧めします。

于 2013-05-10T19:02:55.197 に答える
5

拡張する唯一の理由Threadは、スレッドが実行しているタスクではなく、スレッド自体に関連付けられている動作を追加する必要がある場合です。

たとえば、スレッドプールを実装している場合 ( を考えると、もう誰もやるべきではありませんjava.util.concurrent)、スレッドの動作を変更して、(1) 新しい作業を受け入れることができるようにし、(2) 自身をプール。非常に単純化された形式で:

public void setRunnable(Runnable runnable) {
    this.runnable = runnable;
}

public void run() {
    while (true) {
        // wait on lock
        try {
            this.runnable.run();
        }
        catch (Throwable ex) {
            // do something with exception
        }
        finally {
            // return to pool
        }
    }
}
于 2013-05-10T19:04:55.267 に答える
0

簡単に言えば、Thread を拡張すると、拡張元になる唯一のクラスになります!

于 2014-04-08T12:28:56.657 に答える