Java/ マルチスレッド・プログラミング

プロセス
OSにおける処理の単位のようなもの
スレッド
プロセス内で実行される一連の処理の流れのこと

プロセス内では 処理の流れを平行して複数実行することも出来る
複数のスレッドを同時実行した状態をマルチスレッドと呼ぶ
1つのスレッドで処理を進める状態をシングルスレッドと呼ぶ


マルチスレッドでは
基本的に各スレッドがほかのスレッドと同期をとらず別々に処理を実行する
マルチスレッドを実現するには新たなスレッドを生成/実行する処理をプログラム内に実装する
実装方法は2つ

実装方法1
Threadのサブクラスを作成する方法
Threadを継承してrunメソッドをoverrideする
runが生成されたスレッド上で実行される処理になる
runを新たなスレッドとして実行するには
まずThreadのサブクラスをインスタンス化する
次にその結果生成されたオブジェクトのstartメソッドを呼ぶ
startを呼ぶことでJVMが新しいスレッドを生成して実行する

実装方法2
Runnableをimplementsする方法
Runnableをimplementsしてrunメソッドを実装する
実行するには
まずRunnableをimplementsしたクラスをインスタンス化する
次にインスタンスをThreadのコンストラクタの引数に渡してThreadオブジェクトを生成する
最後に同オブジェクトのstartメソッドを呼ぶ

使い分けの指針
以下を確認する
・runメソッドを実装するクラスが既にほかのクラスのサブクラスになっている
・runメソッドを実装するクラスが「スレッドの実行」以外の役割を持っている

Javaでは多重継承できない
runメソッドを実装するクラスが既にほかのクラスのサブクラスになっている場合そのクラスをThreadのサブクラスにできない
→Runnableをimplementsしてマルチスレッドを実現する他ない

runメソッドを実装しようとしているクラスが何かの役割を持ったクラスで
かつその役割がスレッドの実行とは関連がない場合は
Threadのサブクラスにすると同クラスのメソッドを全て継承することになり
本来の役割とは関係のない機能を持たせることになってしまう

上記2点に当てはまらない場合はThreadのサブクラスとして定義する方が良い


マルチスレッドの落とし穴
バグを発生させないためには

隠すレッドで実行される更新系のメソッドにsynchronizedを指定すること
synchronizedされたメソッドは複数のスレッドから同時に実行されることがなくなる
ただし
並行して処理を進められないため性能に悪影響を及ぼす

スレッドごとに別々の変数を用意すること
各スレッドが別々に参照/更新する変数をスレッドローカル変数と呼ぶ
Javaではスレッドローカル変数をjava.lang.ThreadLocalで実現する

ref:
ITアーキテクト, マルチスレッド・プログラミング 並行処理によるバグのぱっせいを防ぐ実装方法, 2006/12/25
http://www.itarchitect.jp/beginners/-/51389.html

tag : マルチスレッド

2011-10-02 10:29 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud