こんにちは !少し問題があります。マルチスレッドを学習したばかりで、まだすべてを理解しているわけではありません。
私は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++;
.....