0

演習があります: AtomicIntegers (0 に初期化) の行列が与えられた場合、行ごとにスレッドを実行し、列ごとにスレッドを実行する必要があります。行では 1 を減算し、列では 1 を追加します。マトリックスはそのままにしておく必要があります。問題は、行列が変化することです! コードは次のとおりです。オブジェクトは、行列、列または行を操作するように指示するブール値、および操作する必要がある列/行のインデックスを受け取ります。

import java.util.concurrent.atomic.AtomicInteger;

public class FifthExerciseSafe implements Runnable{
    private Thread thread;
    private boolean onRows;//tells if the object operates on the rows or on the columns
    private AtomicInteger[][] matrix;
    private int index;

public FifthExerciseSafe(AtomicInteger[][] matrix, boolean onRows, int index){
    this.matrix = matrix;
    this.onRows = onRows;
    this.index = index;
}

public void start(){
    thread = new Thread(this);
    thread.start();
}

public boolean isOnRows() {
    return onRows;
}

public void setOnRows(boolean onRows) {
    this.onRows = onRows;
}

public AtomicInteger[][] getMatrix() {
    return matrix;
}

public void setMatrix(AtomicInteger[][] matrix) {
    this.matrix = matrix;
}

@Override
public void run() {
    if (this.onRows){
        for(int i = 0; i < matrix[index].length; i++){
            matrix[index][i].decrementAndGet();
        }
    } else {            
        for(int i = 0; i < matrix.length; i++){
            matrix[i][index].incrementAndGet();
        }
    }
}//run

public static void main(String args[]){
    AtomicInteger[][] m = new AtomicInteger[3][3];
    for (int i = 0; i < m.length; i++){
        for(int j = 0; j < m.length; j++){
            m[i][j]= new AtomicInteger(0);
        }
    }

    for(int i = 0; i < 3; i++){//I create 6 objects, 3 for columns and 3 for rows
        FifthExerciseSafe fes1 = new FifthExerciseSafe(m, true, i);
        FifthExerciseSafe fes2 = new FifthExerciseSafe(m, false, i);
        fes1.start();
        fes2.start();
    }
    for(int i = 0; i < m.length; i++){
        for(int j = 0; j < m.length; j++){
            System.out.print(m[i][j]+" ");
        }
    }
}//main
}

出力は 000000 のはずですが、-100-100-1-10 の場合もあります

Intel Atom を搭載したネットブック、Core Duo を搭載したデスクトップでのみ発生します。

4

1 に答える 1

6

スレッドを開始しましたが、マトリックスの出力に進む前にスレッドが終了するのを待つことはありません。Thread.join開始されたスレッドごとに使用する必要があり、スレッドが完了するまでブロックされます。そうして初めて、結果を安全に印刷できます。たとえば、ArrayListあなたaddのすべてのインスタンスが開始する を導入し、各インスタンスで呼び出すThread個別のループを作成します。forjoin

于 2012-11-20T10:20:15.120 に答える