javaにおけるRunnableとCallableの違い
JavaではRunnableとCallableはどちらもマルチスレッドプログラミングに使用されるインタフェースですが、以下のような違いがあります。
- 戻り値:Runnableインタフェースは戻り値なしで、Callableインタフェースは実行結果を返すことができる。
- 例外をスロー:Runnableインタフェースのrun()メソッドは例外をスローできませんが、Callableインタフェースのcall()メソッドは例外をスローできます。
- Runnableインターフェイスのrun()メソッドはThreadクラスのstart()メソッドでのみ呼び出せるが、Callableインターフェイスのcall()メソッドはExecutorServiceのsubmit()メソッドで呼び出せる。
- 多スレッドの並行実行を制御:CallableインターフェースはFutureインターフェースを使用して実行結果の取得、実行のキャンセル、実行完了の待機といった操作を行うことができます。Runnableインターフェースにはこれらの機能はありません。
つまり、Runnable は実行結果の取得が不要な場合に適しており、Callable は実行結果の取得や並行制御が必要な場合に適しています。