私はスレッドの同期について把握しようとしていますが、私は遭遇している問題を理解していません。スレッドが同期しないのはなぜですか?
誰かがこれを診断するのに役立ちますか、それとも自分自身でこれを診断する方法を説明してください。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CyclicBarrier;
public class Controller {
public static void main(String[] args) {
int numThreads = 0;
List<Thread> threads = new ArrayList<>();
if (args.length > 0) {
numThreads = Integer.parseInt(args[0]);
}
else {
System.out.println("No arguments");
System.exit(1);
}
CyclicBarrier barrier = new CyclicBarrier(numThreads);
int arr[][] = new int[10][10];
for (int i = 0; i < numThreads; i++) {
Thread newThread = new Thread(new ThreadableClass(barrier, arr));
threads.add(newThread);
}
for (Thread thread : threads) {
thread.start();
}
}
}
コマンドライン引数として必要なスレッドの数を受け入れる主な方法(上記)があります。
の大きさを想像import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class ThreadableClass implements Runnable {
private CyclicBarrier barrier;
private int arr[][];
public ThreadableClass(CyclicBarrier barrier, int[][] arr) {
this.barrier = barrier;
this.arr = arr;
}
@Override
public void run() {
long threadId = Thread.currentThread().getId();
System.out.println(threadId + " Starting");
for (int i = 0; i < 10; i++) {
changeArray();
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
private synchronized void changeArray() {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j]++;
}
}
printArray();
}
private synchronized void printArray() {
System.out.println(Thread.currentThread().getId() + " is printing: ");
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
:そして、私はインクリメントに2次元配列内のすべての要素を持っているし、次のスレッドが同じことを行うにはその機会を得る前に、アレイを印刷することを目指しています作業の流れは、(下記)があります配列は2×2で、期待される出力は次のようになります:
1 1
1 1
2 2
2 2
3 3
3 3
4 4
4 4
...
...
(10 * numThreads)-1 (10 * numThreads)-1
(10 * numThreads)-1 (10 * numThreads)-1
(10 * numThreads) (10 * numThreads)
(10 * numThreads) (10 * numThreads)
代わりに、すべてのスレッドが配列をインクリメントし、互いの上に印刷を開始します。
真剣に:これは大きな質問です。あなたはあなたのすべてのコードを置くが、そのコードはあまりにも多くない。予想された出力と実際の出力について説明しました。今すぐに受け入れるならば、素晴らしい仕事をしただけです;-) – GhostCat