
ダイテル社のJavaプログラミングvol.2という本のサンプルコードなのですが、このプログラムは、5つの要素を持つ配列を共有バッファとし、それを生産者スレッドと消費者スレッドの共有資源とするものです。
ProduceIntegerクラスが生産者、ConsumeIntegerが消費者に対応しています。共有バッファは、HoldIntegerクラスのインスタンス変数holdvalue[]です。生産者は共有バッファに0~9の整数を書き込み、消費者は書き込まれた整数を読み込むことによって生産者-消費者を再現しています。実行結果について、正しく生産者が生産した0~9を漏れることなく消費しているのですが、ここで質問です。
生産者スレッドは、0~9の値を書き込むと、HoldIntegerクラスのmoreDataをfalseに設定して死亡します。
消費者スレッドは書き込まれた値を全て消費するまで58行目のwhile文で繰り返されます。生産者スレッドのほうが、消費者よりもsleep時間が短いので、大抵生産者スレッドは先に値を書き込み終わります。生産者スレッドが値を書き込み終わりmoreDataフラグをfalseにしたあたりのところ(実行結果26行目)で疑問があるのですが、まず生産者スレッドのwhile条件は(moreDataがfalse かつ writeLocとreadLocが同じ)でない時です。もし、生産者スレッドがmoreDataフラグをfalseにした次の瞬間に消費者スレッドのwhile条件が評価された場合は、実行結果を見て分かるようにreadLoc=0, writeLoc=0なのでそこでwhileを抜けて消費しおわってない状態でスレッドが死亡してしまうと思ったのですがどうでしょう?sleepTimeを乱数でとっているためタイミングによって左右されるのではないでしょうか。納得ができないので、どうか説明よろしくお願いします。説明分かりにくかったらすみません。
ソース:http://izumo.cool.ne.jp/precious7/SharedCell.java
実行結果:http://izumo.cool.ne.jp/precious7/result.txt
No.1ベストアンサー
- 回答日時:
おはようございます。
確かに、おかしいですね。
ほとんどの場合、5,6,7,8,9が消費されないまま、終了してしまいますね。
HoldIntegerクラスのgetmoreDataメソッドは、
readLoc == writeLoc の場合、バッファが満タンの場合と、空の場合の二通りあるのだから、
正しくは
public boolean getmoreData(){
if ( moreData == false && readable == false)
return false;
return true;
}
こうでしょうねぇ。
それにしても、妙に読みにくいサンプルですよねぇ。
バッファにたまっている要素数を、カウントしていったほうが、読みやすくなると思うんですけどなぁ。
そうすれど、こんな簡単な失敗もしなくてすむのに・・・。
あんまり、よくない本なんですかね。
素早い回答ありがとうございます!
確かにreadable==falseという条件なら納得できます。
本が間違ってることはないって頭で考えてたんで気づかなかったです。
この本にのってるサンプルは、あまり良いものではないかもしれませんね・・・
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#の処理をリアルタイムに表示...
-
Java ログ出力方法
-
Javaでのデバッグコード削除
-
Javaアプリケーション実行の返...
-
JavaScriptでできることについて
-
無限ループをわざと作って時計...
-
データファイルの読み込みについて
-
Threadの停止について
-
セル範囲で文字を検索はFor必須?
-
[Java] while(true)の意味
-
PHPでDB処理中にプログレスバー...
-
Androidアプリで本体の音量変更...
-
ラジオボタンの選択判定
-
BLOB型の画像データを表示したい
-
tryの終了
-
flush()メソッドについて・・・
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ラジオボタンの選択判定
-
Javaプログラムからポップアッ...
-
[Java] while(true)の意味
-
Javaでのデバッグコード削除
-
tryの終了
-
doGetとdoPostの違い
-
数値の定数を付ける時
-
onBlurとonFocusの処理順序につ...
-
BLOB型の画像データを表示したい
-
1日の始まりを合図する
-
ラベルの表示までが異常に遅い...
-
C#で別スレッドの終了を知りたい
-
javaのプログラムが止まる
-
Tomcat高負荷時の設定について
-
表示待ち時間に「処理中...」の...
-
どうコーディングしたらよいの...
-
マルチスレッドのデバッグ
-
ExcelVBA で文字列の特定の文字...
-
スレッド1とスレッド2を交互に...
-
C#の処理をリアルタイムに表示...
おすすめ情報