幸福なプログラマ

プログラマは幸福になれる。

Threadクラスの継承ではなく、Runnableインタフェースを実装したクラスに処理を委譲する

javaで非同期処理を実現する際、以下のようにThreadクラスを継承したサブクラスを作成し

public class MyThread extends Thread {
    @Override
    public void run() {
        // 非同期処理
    }
}

下記のように呼び出すと思います。

MyThread thread = new MyThread();
thread.start();

これはそのまま以下のようにRunnableインタフェースを実装したクラスで置き換えることが可能です。

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 非同期処理
    }
}
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

Thread#run()のデフォルト実装がThreadクラスのコンストラクタに渡されたRunnableを実装したクラスのrunメソッドを実行するようになっているため上記のように置き換えが可能となります。

Runnableインタフェースの実装を使うべき理由として以下が上げられます。

  • 継承よりも委譲を使うことでクラス間の独立性が高まる。
  • Threadクラスはスレッド生成、Runnable実装は実行する処理を記述するものとしてそれぞれの責務を分離できる。