演習があります: 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 を搭載したデスクトップでのみ発生します。