teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2016/12/27 01:57

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,2 +1,6 @@
1
1
  スレッド処理をするThreadクラスは、**コンストラクタで受け取ったオブジェクトのrunメソッドを実行する**仕組みになっています。このオブジェクトはrunメソッドさえ持っていれば十分で、それが実際にどういうものであるとか、どういった仕組みで動いているかなどは関係ありません。
2
+
3
+ ここで問題になるのは、**渡されるオブジェクトがrunメソッドを確実に持っているか**ということです。Threadの仕組み上、runメソッドを持って入れば何でも受け入れたいところですが、Javaは型安全性を優先するため、変数の型となるクラスで宣言もしくはその親クラスから継承されているメソッドしか使うことができません。
4
+ Objectクラスはrunメソッドを持っておらず(持たせると何でもかんでも別スレッド処理できるようになってしまい危険)、特定のクラスにrunメソッドを持たせて継承して使うとすると、別スレッド処理のためだけにそのクラスを継承する必要があり、(Javaでは多重継承はできないため)本来の機能として別のクラスを継承したいのにできないという本末転倒なことになります。この問題を解消するのがRunnableインタフェースの存在です。
5
+
2
6
  Runnableインタフェース自体はスレッド処理に関しては何もしませんが、あるクラスにRunnableインタフェースを実装することは、**そのクラスがrunメソッドを持っている**ことを保証します。その保証を付けることで、安全にThreadのコンストラクタに渡せるようになっているのです。