Javaプログラム例
Last modified: Wed Aug 29 22:26:02 2001 JST
Javaでのマルチスレッドを用いた並行プログラムの例が置いてあります.
アプレットは含まれていません.
すべての実行結果
逐次実行
単一スレッドでの逐次実行.
相互に干渉しないスレッドの実行
start, stop, join, yield の使い方を学ぶ.
- Kobe と別スレッドで表示する.
Threadオブジェクトを生成して,startで実行する.
- Kobe 1, ..., Kobe 10 とそれぞれ別スレッド(10個のスレッド)で表示する
- Kobe n を表示後,Kobe 2n と Kobe 2n+1 を表示する
子スレッドを作る.
ただし,n は 15以下.
- 2つのスレッドがそれぞれKobe 1, ..., Kobe 10 と表示する.
両方のスレッドが公平(fair)に動くようにする(yieldを使う).
- Ex0103 と同様だが,Kobe n を0.5秒毎に繰り返し表示する.
プログラム開始から3秒経過したら,
main からすべてを停止させる.
- Ex0104 と同様だが,Kobe n を0.5秒毎に繰り返し表示する.
プログラム開始から3秒経過したら,
親が子を停止させるのを繰り返すことによって終了する.
- Ex0103と同様だが,すべてのスレッドの実行が終わるのを待ってから,
Endと表示する.joinを使用する.
相互に干渉するスレッドの実行
synchronized, wait, notify, notifyAll の使い方を学ぶ.
- 10個のスレッドが並行して動作し,1つのカウンタを10づつ
インクリメントする.
相互排除を行うために,synchronizedを使わないといけない.
- Ex0201と同様だが,fairnessを保つようにする
(すべてのスレッドが公平に動く).
yield を使う.
- 複数の子スレッドが並行して動作し,
親スレッドが go を実行するまで待ち,
go が実行されたら Kobe と表示する.
go が先に実行されていれば,待たずに表示する.
- next() が呼ばれるたびに Kobe 1, Kobe 2, ... と表示する.
表示が終わるまでは,呼出し側は止まる.
synchronized, wait, notify を使って,同期をとる必要あり.
- セマフォの実現.
- 生産者消費者問題.無限長バッファで実現する.
バッファが空の時,消費者は wait し,
バッファが空で無くなるとき,生産者が notify する.
消費者が starvation 状態にならないようにしなければならない
(yieldを使う).
- Ex0211と同様だが,複数の生産者消費者がおなじバッファを
並行して利用できるようにする.
待っている消費者全員を起こすには,notifyAll を使う.
生産者消費者の fairness を保つようにしなければならない.
- 生産者消費者問題.有限長バッファで実現する.
バッファが空の時,消費者は wait し,生産者が notify する.
バッファがfullの時,生産者は wait し,消費者が notify する.
- readers/writers問題.
- 食事する哲学者の問題.
通信チャネルを用いたプログラム
有限長バッファを通信チャネルとして用いる
(Channel.java).
恥ずかしながら,以前のプログラムは間違っていました (^_^;)
- 自然数の無限列の生成.1, 2, ... を生成する.
- 素数の無限列の生成(エラトステネスの篩).
- ハミングの問題.
リンク
田村直之
This page has been accessed
times since May 15, 1997.