読者です 読者をやめる 読者になる 読者になる

ぱらすの備忘録

個人的な備忘録なので間違った解釈があれば教えて下さい

Javaでマルチスレッド

Javaのマルチスレッドについて不思議に思ったのでメモ程度に
 
マルチスレッド実装には以下の2種類がある
・Threadクラスを継承したクラスを作成
・Runnableインターフェースを実装して作成
 

 

さて、今何気なくThreadクラスを先に書いたけども、
多くのサイトでThreadクラスを先に書いていたから真似ただけ。
(閲覧したサイトの不満ではありません)
 
ここで不思議なのがなぜThreadクラスを使った説明が先なのかということ。
ちなみにそれぞれのメリットはざっと調べた感じだいたい以下の通り。
 
・Threadを継承
マルチスレッド処理に関わる多くのメソッドが使える(扱いやすい?)
 
 
・Runnableインターフェースを実装
多重継承を考えなくても済む(他のクラスを継承できる)
他のインターフェースももちろんimplementできる
プログラムの再利用性向上
 
デメリットはだいたい以下の通り
 
・Thread
他のクラスを継承できない
 
…………あれ?
Runnableに対するデメリットがない…。
 
Runnableインターフェースで実装する際、Threadクラスに
Runnableインターフェースを実装したオブジェクトを渡してスレッドオブジェクトを作る。
ということはRunnableインターフェースを実装した方法でやったとしても、
結局Threadクラスも使うのだからThreadクラスのメソッドも使えることになる。
 
じゃあThreadクラスを継承して作る利点ってなんなの!!!
 
 
ここで本来の私の疑問に戻ってみる。
---ここで不思議なのがなぜThreadクラスを使った説明が先なのかということ。---
………ふむ。
Threadクラスが扱いやすいくらいしか利点がないから先に書かれるのだろうか?
 
ちょっと逆に考えてみよう。
RunnableでできるならばなぜThreadクラスがあるのだろうか。
いや、待てよ?
よくよく見てみるとRunnableを使っていても結局はThreadも使わないとスレッドとして動かない。
説明の順番からRunnableはThreadの上位互換的な扱いだと勝手に思い込んでいたが、
実際の仕組みとしてはまったくの逆なのではないだろうか。
 
ここまで書いておいてなんなのだが、私はプログラムの書き方を履き違えていたらしい。
自分好みのことをしようとするのに制約が多い方を使うのはたしかに限度がある。
Threadクラスはあくまでもスレッドを作るためのもので制約が多い。
また、さらにその最低限の制約としてRunnableがある。
 
たしかにここを理解した瞬間Threadの説明が先である理由に合点がいった。
Threadの説明が先でなればそもそもスレッドを作ることができないのだから。
 
書きながら考えていたせいで読みにくいものになってしまったが、書きなおしたりはしない。
(前半と後半で書き方が違うのは、間がかなり空いてしまったため)
 
 
 
ちなみにThreadの動きについて調べている時に下記のような説明を見つけたが、
実際の処理を書くクラス (implements Runnable) が、他のクラスを継承できる
extends Thread の場合は、Thread を親に持つので他のクラスを継承できない
Thread 以外の目的でも使える
extends Thread の場合は、Thread を継承する時点で高いコストを払うため、スレッド生成以外に使いにくい
 -----------------------
Hosei University Faculty of Computer and Information Sciencesより
 
とあるが、私にはRunnableインターフェースをThread以外に使用する場面が思いつかない。
一体どういう場面で使うのだろうか。