例えばスレッドを処理するRunnableインターフェースがありますが、Runnnableインターフェースには何も実装されていないのに、なぜスレッド処理のようなことが可能なのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
スレッド処理をするThreadクラスは、コンストラクタで受け取ったオブジェクトのrunメソッドを実行する仕組みになっています。このオブジェクトはrunメソッドさえ持っていれば十分で、それが実際にどういうものであるとか、どういった仕組みで動いているかなどは関係ありません。
ここで問題になるのは、渡されるオブジェクトがrunメソッドを確実に持っているかということです。Threadの仕組み上、runメソッドを持って入れば何でも受け入れたいところですが、Javaは型安全性を優先するため、変数の型となるクラスで宣言もしくはその親クラスから継承されているメソッドしか使うことができません。
Objectクラスはrunメソッドを持っておらず(持たせると何でもかんでも別スレッド処理できるようになってしまい危険)、特定のクラスにrunメソッドを持たせて継承して使うとすると、別スレッド処理のためだけにそのクラスを継承する必要があり、(Javaでは多重継承はできないため)本来の機能として別のクラスを継承したいのにできないという本末転倒なことになります。この問題を解消するのがRunnableインタフェースの存在です。
Runnableインタフェース自体はスレッド処理に関しては何もしませんが、あるクラスにRunnableインタフェースを実装することは、そのクラスがrunメソッドを持っていることを保証します。その保証を付けることで、安全にThreadのコンストラクタに渡せるようになっているのです。
投稿2016/12/24 23:34
編集2016/12/27 01:57総合スコア20651
0
インタフェースそのものに実装を記述することはありません。あくまでもメソッドの宣言がされているだけです。(この他定数の定義はできます)また、インタフェースを単独で使用することは禁止されています。(使用する際には、必ず実装クラスの作成を経由しなければならない)
例えばRunnableについては「run」というメソッドが宣言されており、実装クラス作成時にこの中身を具体的に定義することを要求します。
したがって、Runnableインタフェースを使用する際には、「run」メソッドを具体的に定義した実装クラスが必要となるので、使用者側から見れば「実装がない」ということは起こり得ません。
投稿2016/12/25 03:33
編集2016/12/25 03:34総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/12/26 00:04 編集
2016/12/26 00:11
2016/12/26 20:33
2016/12/26 20:52
0
アプリケーションが動いているということは、その時点ですでにスレッドが1つはあるということになります。
runが呼び出された場合、呼び出し元のスレッドで実行されます。
一方、Thread.start()は、新しくスレッドを立ち上げます。
投稿2016/12/24 22:26
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。