1

ここに画像の説明を入力

こんにちは !少し問題があります。マルチスレッドを学習したばかりで、まだすべてを理解しているわけではありません。

私は3つのスレッドを持っています.1と2はランダムなマトリックスを生成し、すべてのステップの後、パイプマトリックス要素によって同様のパラメータを送信します. 3 次元スレッドはそれらを比較して結果を書き込み、その後 1 番目と 2 番目のスレッドが次のステップを実行し、それを 5 回繰り返します。

私の問題:正しい作業のためにすべての踏み板を同期させる必要があります。この問題はプロデューサー/コンシューマーの問題と似ていますが、ここでは 2 つのプロデューサーと 1 つのコンシューマーがあります。


public class Producer1 extends Thread{
    CyclicBarrier cbar;
    public Producer1(CyclicBarrier c){
        cbar=c;
        new Thread(this).start();
    }
    private Random generator = new Random();
    int []matrix1 = new int[1000];


    private PipedWriter out = new PipedWriter();

    public PipedWriter getPipedWriter() {
        return out;
     }

    public void run() {
        for(int i =0;i<5;i++){
            matrix1[i]= generator.nextInt(10)+10;
             System.out.println("matrix1["+i+"]= "+matrix1[i]);
             try {

                  out.write(matrix1[i]);
                  cbar.await();
                  sleep(500);
                } catch (Exception e) {
                  throw new RuntimeException(e);
                }
        }
    }
}    

public class Producer2 extends Thread{
     Random generator = new Random();
     int []matrix2 = new int[1000];
     CyclicBarrier cbar;
        public Producer2(CyclicBarrier c){
            cbar=c;
            new Thread(this).start();
        }
     private PipedWriter out = new PipedWriter();

        public PipedWriter getPipedWriter() {
            return out;
         }
        public void run() {
            for(int i =0;i<5;i++){
                matrix2[i]= generator.nextInt(20)-10;
                 System.out.println("matrix2["+i+"]= "+matrix2[i]);
                 try {
                      out.write(matrix2[i]);
                      cbar.await();
                      sleep(500);
                    } catch (Exception e) {
                      throw new RuntimeException(e);
                    }
            }   
        }
} 

    public class Main {
    public static void main(String[] args) throws IOException { 
     Producer1 prod = new Producer1(new CyclicBarrier(2, new Consummer(prod,prod2)));   
        // here is a problem  "prod2 cannot be resolved to a variable" 
                                                     // How can i do it work??
     Producer2 prod2 = new Producer2(new CyclicBarrier(2, new Consummer(prod,prod2)));
         CyclicBarrier cb1 = new CyclicBarrier(2, new Consummer(prod,prod2)); 

        prod.start();
        prod2.start();
    }

}

public class Consummer extends Thread{
     private PipedReader el1;
     private PipedReader el2;


      public Consummer(Producer1 sender, Producer2 sender2) throws IOException {
        el1 = new PipedReader(sender.getPipedWriter());
        el2 = new PipedReader(sender2.getPipedWriter());
      }

    public void run() {
         try {

               while (true) {

                System.out.println("Element1 : " +  el1.read()+" Element2 : " +  el2.read());
               }
            } catch (IOException e) {
              throw new RuntimeException(e);
            }

    }

}


            for example : 
i=0
1-> 10
2-> 5
3-> first is bigger =10
i++;

i=1;
1-> 3
2-> 5
3-> Second is bigger =5
i++;

i=2;
1-> 4
2-> 4
3-> both are equal = 4
i++;
.....
4

2 に答える 2

1

構造を単純化する可能性のある1つのオプションは、BlockingQueue:を使用することです。

  • main、2つのキューを作成し、それぞれを各プロデューサーに渡し、2つをコンシューマーに渡します。
  • プロデューサーはキューに書き込みます
  • コンシューマーは両方のキューから読み取り、次のことを行います。

while (true) {
  int[] matrix1 = queue1.remove();
  int[] matrix2 = queue2.remove();
  // process the two 
}
于 2013-01-09T22:27:02.573 に答える
0

コンシューマーに渡しbarrier、次のように印刷する前に待機させます。

           while (true) {
            barrier.wait();
            System.out.println("Element1 : " +  el1.read()+" Element2 : " +  el2.read());
           }
于 2013-01-09T20:07:03.327 に答える