• 締切済み

「複数の」生産者消費者問題 in Java

基本的に生産者消費者問題なんですが Aが物を作るとBに渡し、Bが物を作るとCに渡し、Cが物を作るとDに渡す、というように 複数の生産者/消費者のベルトコンベヤーでの流れ作業を想定しています。 で以下のように組んでみたんですが、 B自身が「消費した/してない」をB自身に知らせていないので Bは勝手に作り始めてしまいます。 public class Main { public static void main(String args[]) { ConveyerBelt stationAB = new ConveyerBelt(); ConveyerBelt stationBC = new ConveyerBelt(); ConveyerBelt stationCD = new ConveyerBelt(); Worker producerA = new Worker(stationAB); Widget consumerB = new Widget(stationAB); Worker producerB = new Worker(stationBC); Widget consumerC = new Widget(stationBC); Worker producerC = new Worker(stationCD); Widget consumerD = new Widget(stationCD); producerA.start(); consumerB.start(); producerB.start(); consumerC.start(); producerC.start(); consumerD.start(); } } ConveyerBelt()バッファーがABとBCとCDの三つというのは正しいと思うんですけど スレッドはAとBとCとDの四つだけ作ればいいんでしょうか? でもその場合はConveyerBelt class自体はどんな風にいじればいいのでしょうか? ちなみにConveyerBelt()バッファーを一つにすればみんな同期しますが 当然ながら流れ作業になりません。 分からないところがあれば補足しますので、どなたかご教授下さい。 どうかお願いします。m(__)m

みんなの回答

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

「Aが物を作るとBに渡し」と「Bが物を作るとCに渡し」のBというのはどうのような関係にあるのでしょうか? 同一人物だと思うのですが、そのことが定義されていません。 そこに問題があるのではないかと思います。

kicker
質問者

お礼

その定義の方法を尋ねたのですが…。 もうとっくに自己解決してしまいました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

とりあえず参照URLの本を読んで内容を理解すれば解決できるでしょう。

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4797319127/qid=1139623843/sr=1-2/ref=sr_1_10_2/503-5912056-1554313
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • java

    次のコード中の括弧内で下に示す11通りの各コードを実行した場合の実行画面を正確に答えよ。 class A{ public void func1(){System.out.println("A1");} public void func2(){System.out.println("A2");} } class B extends A{ public void func1(){System.out.println("B");} } class C{ public int x=0, y=1; } class D extends C{ public int x=2; public void func1(int x){System.out.println(x);} public void func2(int x){System.out.println(this.x);} public void func3(int x){System.out.println(super.x);} public void func4(int x){System.out.println(this.y);} public void func5(int x){System.out.println(super.y);} } class E{ public void func1(int n){ try{ System.out.println("E1"); int[] ary=new int[n]; System.out.println("E2"); }catch(NegativeArraySizeException e){ System.out.println("E3"); }finally{ System.out.println("E4"); } } } (1) A a=new A(); a.func1(); (2) A a=new B(); a.func1(); (3) B b=new B(); b.func1(); (4) B b=new B(); b.func2(); (5) D d=new D(); d.func1(3); (6) D d=new D(); d.func2(3); (7) D d=new D(); d.func3(3); (8) D d=new D(); d.func4(3); (9) D d=new D(); d.func5(3); (10) E e=new E(); e.func1(5); (11) E e=new E(); e.func1(-2); (1) A1 (2)B (3)B (4) A2 (5) 3 (6) 2 (7) 0 (8) 1 (9) 1 (10) E1E2E4(11) E1E3E4 と答えになるんですがなぜこうなるのかわかりません。教えてください

    • ベストアンサー
    • Java
  • Java コレクション・ジェネリクスについて

    Javaのコレクション・ジェネリクスについてです。 以下のコードについて、私はa.y();でAインタフェイスにyメソッドがないため コンパイルエラーになるのではないかと思っているのですが(実際にエラーが出ている) 書籍では「実行されるがなにも表示されない」とあります。 もし私の考え方に間違いがあればご指摘いただけると幸いです。 ocj-pを受験目前なので切実です。 よろしくお願いいたします。 interface A { void x(); } class B implements A { public void x(){} public void y(){} } class C extends B public void x(){} } public class D { public static void main(String[] args) { List<A> list = new ArrayList<A>(); list.add(new B()); list.add(new C()); for(A a : list) { a.x(); a.y(); } } }

    • ベストアンサー
    • Java
  • javaのクラスの作り方、エラーの原因が不明です

     今晩は、javaの初心者です。宜しく願いします。  下のようなコードを書いたら、「アクセス可能な型 C1 のエンクロージング・インスタンスが ありません。  型 C1 のエンクロージング・インスタンスで割り振りを限定する必要があります (たとえば x.new A() で、x は C1 のインスタンス)。」 とエラーが出ました。  eclipseでは、「C2 c_2 = new C2() ;」の箇所で赤いエラーマークが表示されています。  C1クラスとC2クラスを分けてやると正常に実行されます。  C1クラスの中にC2クラスを作ると文法的にどこがまずいのでしょうか。  あるクラスの中に別のクラスを書いているプログラムを見たような気もするのですが。  C1クラスとC2クラスをわかるのとはJAVA的に何がいけないのでしょうか。  原因がさっぱり分りません、宜しくお願いいたします。 ======================================================================= public class C1 { int a = 9 ; int b = 8 ; int c = 7 ; int d = 6 ; // C2 c_2 ; public void Calc1() { System.out.println("a+b= " + (a+b)) ; } public static void main(String[] args) { C2 c_2 = new C2() ; c_2.Calc2() ; C1 c_1 = new C1() ; c_1.Calc1(); // c_1.Calc2(); } class C2 { // int c = 7 ; // int d = 6 ; public void Calc2() { System.out.println("c-d= " + (c-d)) ; } } } =========================================================================

  • [javaプログラムについて] うまく動きません。

    import java.*; class Test { void main() { Th th1 = new Th("01スレッド"); Th th2 = new Th("02スレッド"); th1.start(); th2.start(); } } class Th extends Thread { void run(String pri) { for (int i=0;i<5;i++) { System.out.println(pri + " : " + i); } } } スレッドの使い方がいまいちよく分かりません。 どこが間違っているのか教えてください。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • Javaアプレットで複数のスレッド (初心者です)

    javaアプレットで二つのスレッドを作り、それぞれからパラパラアニメ(0.4秒間隔で絵が変わるものanime1と0.7秒のものanime2)を表示させたいと考えています。 パラパラアニメ本体はhttp://www.ipc.hokusei.ac.jp/~z00104/java/anim.htmlをほぼコピーで使わせてもらい、それ単体では動かせました。 しかし二つスレッドを作るためにRunnableを実装したクラスを二つ用意して、それをまた別の一つのクラスから呼び出すことがうまくできません。 public class oshietegoo extends Applet{ anime1 aa = new anime1(); anime2 bb = new anime2(); Thread a = new Thread(aa); Thread b = new Thread(bb); a.start(); b.start(); //(スレッドの作成についてはhttp://www.tohoho-web.com/java/thread.htmを参考にしました) } class anime1 extends Applet implements Runnable{ 【中身は最初のURLのコピー】 } class anime2 extends Applet implements Runnable{ 【中身は最初URLのコピー】 } というように書いているのですが、a.start();とb.start();のところで「トークン "start" に構文エラーがあります。このトークンの後には Identifier を指定する必要があります」とエラーが出てしまいます。 色々と調べたり、インスタンスやクラスなど基本的な概念を勉強したりしたつもりなのですが、なぜエラーが出るのか分かりませんでした……。 どなたか解決法を教えていただけませんでしょうか? 初心者な質問で申し訳ないのですが、お力添えいただけると助かります。 不足があれば追記いたしますので、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaのコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

  • JAVAアソシエイツの問題

    「SUN教科書 JAVAアソシエイツ P209 問5-7」からの問題についてです。 次のプログラムの空欄(1)に入れて実行すると、出力結果がtrueになる コードはどれですか。4つ選択してください。 class Sample{ public static void main(String[] args){ String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); System.out.println( 【(1)】 ); } } A. s1 == s2 B. s1 == s3 C. s2 == s3 D. s1 == "Hello" E. s3 == "Hello" F. s1.equals(s3) G. s2.equals(s3) 正解はADFGです。AFGに関しては理解出来るのですが、 どうして選択肢Dがtrueなのに選択肢Eはfalseになるのでしょうか。 よろしくお願い致します。  

    • ベストアンサー
    • Java
  • javaについて質問です。

    import javax.swing.*; import java.awt.*; import java.awt.event.*; class MoveField extends JPanel {       private int xc;       private int yc;       int d = 50;       Color c=Color.red;       int pause =1000;       boolean cont=true; thread th;       MoveField(){}       MoveField(int d){this.d=d;}       MoveField(int d,Color c){this(d);this.c=c;}       boolean isHit(int x,int y){             int w=(x-xc)*(x-xy)+(y-yc)*(y-yc);             if(w<=d*d){return true;}       return false; }       void start(){             cont=true; th= new Thread(this);             th.start(); } void stop() {cont=false:} public void run(){ when(cont){ int x=0 int y=0 if(Math.random()<0.5){x=(int)(Math.random()*(getWidth()-d));} if(Math.random()<0.5){y=(int)(Math.random()*(getHeight()=d));} xc=x; xy=y; repaint(); try{Thread.sleep(pause);}catch(Exception e){} } } @Override public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,getWidth(),getHeight()); gsetColor(c); g.fillOval(xc,yc,d,d); } } class MoveHit extends JFrame impkements ActionListener{ MoveField field; JTextField txt; nt pt=0; MoveHit(){ setDefaultCloseOperation(EXIT_ON_CLOSE); field=new MoveField(); add(field); JPanel p=new JPanel(); p.add(new Jlabel("Point")); txt=new JTextField(20); p.add(txt); add(p.BorderLayout.NORTH); p=new JPanel() JButton b; b=new JBotton("Start");b.addActionListener(this);p.add(b); b=new JBotton("Stop");b.addActionListener(this);p.add(b); add(p, BorderLayout.SOUTH); }   @Override public void actionPerformed(ActionEvent ev){ string cmd=ev.getActionCommand(); if(cmd.epuals("Stop")){ pt=0; txt.setText(""); Field.start(); } elese if(cmd.equals("Stop"))field.stop(); } public void mouseClicked(MouseEvent ev){ int x=ev.getX(); int y=ev.getY(); if(field.isHit(x,y)){ pt++; Toolkit.getDefaultToolkit().beep(); txt.setText(""+pt); } } public void mousePressed(MouseEvent ev){} public void mouseReleased(Mousevent ev){} public void mouseEntered(MouseEvent ev){} public void mouseExited(MouseEvent ev){} public static void main(String [] args){ MoveHit tx=new MOveHit(); tx.setSize(600,500); tx.setVisible(true); } } このプログラムがうまく作動しません。 エラーは 1.MoveHit.java:30: ';' がありません。 void stop() {cont = false:} 2.MoveHit.java:33: ';' がありません。 when(cont){ 3.MoveHit.java:46: 注釈は -source 1.4 でサポートされていません (注釈を使用可能にするには、-source 1.5 を試してください) @Override 4.MoveHit.java:55: '{' がありません。 class MoveHit extends JFrame impkements ActionListener { です。 また、MoveHitクラスがマウスイベントの処理に対応していないらしいので改善したいです。 ほかに修正点があれば教えてほしいです。協力お願いします。

  • 独習Java章末問題模範解答のソースコードがコンパイルできない

    時間のある方お答えください。 -問題- 次のプログラムを作成しなさい。配列を作成し、それを5個のCharacterオブジェクトで初期化します。その後、StringBufferオブジェクトを生成し、その文字列バッファに配列要素を付加します。最後に文字列バッファを表示します。 -模範解答- class CharacterArray { public static void main(String args[]) { // 配列を作成して初期化する Character array[] = new Character[5]; array[0] = new Character('A'); array[1] = new Character('B'); array[2] = new Character('C'); array[3] = new Character('D'); array[4] = new Character('E'); // 文字列バッファを作成する StringBuffer sb = new StringBuffer(); // 配列要素をバッファに付加する sb.append(array[0]); sb.append(array[1]); sb.append(array[2]); sb.append(array[3]); sb.append(array[4]); // 文字列バッファを表示する System.out.println(sb); } } となっているのですがエラーが16個も検出されてコンパイルできないのです。 どなたか上記ソースコードを訂正してコンパイルできるようにしてください。 /* Javaは訳の分からん概念が沢山あって、どうも直感的に理解しにくいですね。 もう眠い */

    • ベストアンサー
    • Java