
ダイテル社の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で質問しましょう!
似たような質問が見つかりました
- 農林水産業・鉱業 食糧自給率は、革命スローガン? 1 2022/09/05 15:03
- 経済学 答えが二つ出て曖昧なので誰か時給教えていただけると幸いです。 ある財の市場における需要関数と供給関数 3 2022/11/15 23:10
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の民法についての質問になります。 物権変動についての質問になります。 問 不動産の取得 1 2023/05/24 19:36
- 経済 消費税は不平等税制ありその不平等税制にさらに 強制する為にインボイスによる締めつけ 正に日本政府の日 3 2022/10/20 08:04
- 倫理・人権 先進国に共通する「人手不足」問題に、IT化ではなく「奴隷労働」で対処した日本 1 2022/09/02 18:01
- その他(法律) 共有者と弁護士費用の折半分の金額について、意見が分かれています。 2 2022/04/03 15:11
- 消費者問題・詐欺 お金を取り返すことは可能でしょうか? 4 2023/01/07 13:17
- 減税・節税 免税事業者におけるインボイス制度導入後の仕入れ消費税 4 2022/09/19 11:20
- 経済学 軍事部門の生産財と言う概念について(経済学) 7 2022/12/12 00:40
- 高校 小論文のお題です。 どう答えればいいのかわかりません 技術に対する見方について、以下の問いに答えなさ 2 2022/07/28 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ラベルの表示までが異常に遅い...
-
Java ファイルが生成させたか確...
-
C#で別スレッドの終了を知りたい
-
ラジオボタンの選択判定
-
JSPで「処理中」をブラウザに表示
-
Javaでのデバッグコード削除
-
表示待ち時間に「処理中...」の...
-
Javaプログラムからポップアッ...
-
WaitForSingleObjectの復帰時間
-
数値の定数を付ける時
-
ServletContextLisntener#conte...
-
doGetとdoPostの違い
-
JavaScriptとJSPの連携
-
tryの終了
-
ExcelVBA で文字列の特定の文字...
-
PHPでDB処理中にプログレスバー...
-
JAVAからJAVASCRIPT関数を呼び出し
-
マルチスレッドのデバッグ
-
BLOB型の画像データを表示したい
-
VBScriptでのWord印刷
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Java] while(true)の意味
-
tryの終了
-
Javaでのデバッグコード削除
-
Javaアプリケーション実行の返...
-
Javaプログラムからポップアッ...
-
onBlurとonFocusの処理順序につ...
-
Tomcat高負荷時の設定について
-
数値の定数を付ける時
-
アコーディオンメニューをアン...
-
ラジオボタンの選択判定
-
ラベルの表示までが異常に遅い...
-
ExcelVBA で文字列の特定の文字...
-
C#で別スレッドの終了を知りたい
-
素数判定を再帰処理で
-
JavaScriptからJAVAクラスを呼...
-
switch文の中に、throws new Ex...
-
PHPでDB処理中にプログレスバー...
-
C#の処理をリアルタイムに表示...
-
Windowsサービスの処理
-
ftp 同時複数接続の負荷テスト...
おすすめ情報