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
実装は実行する処理を記述するものとしてそれぞれの責務を分離できる。