gpt4 book ai didi

Java - 当我尝试打印时线程池同步问题

转载 作者:行者123 更新时间:2023-12-02 01:35:20 25 4
gpt4 key购买 nike

我使用 ThreadPool 类,当我尝试打印矩阵时,这就是我得到的:

 Enter number of threads:
5
Enter number of matrices:
3
Enter number diminesion:
2
[1][1][0][1]
[0][1]
-----------------------------------------------
[0][0]
[1][0]
-----------------------------------------------

[0][1]
-----------------------------------------------

我尝试同步,但仍然无法正常工作,为什么?另一个问题是,当我尝试使用主类中的GenerateMatrix 类的矩阵队列时,队列为空,id 做错了什么?因为我尝试做的是生成 n 矩阵,并在生成完成后将所有矩阵相乘。

主要:

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class main {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);

Queue<int[][]> matrices = new LinkedList<int[][]>();

System.out.println("Enter number of threads:");
int numOfThreads = input.nextInt();

ThreadPool pool = new ThreadPool(numOfThreads);

System.out.println("Enter number of matrices:");
int numOfMatrices = input.nextInt();

System.out.println("Enter number diminesion:");
int diminesion = input.nextInt();

for (int i = 0; i < numOfMatrices; i++) {
GenerateMatrix generateMatrix = new GenerateMatrix(numOfMatrices,
diminesion);
pool.execute(generateMatrix);

}

}
}

生成矩阵类:

import java.util.LinkedList;
import java.util.Queue;

public class GenerateMatrix implements Runnable {

private int numOfMatrices;
private int dimension;
private static Queue<int[][]> matrices = new LinkedList<int[][]>();

public GenerateMatrix(int n, int d) {
numOfMatrices = n;
dimension = d;
}

public Queue<int[][]> getMatricesQueue() {
return matrices;
}

public void run() {
int[][] tempMatrix = new int[dimension][dimension];

for (int i = 0; i < tempMatrix.length; i++) {
for (int j = 0; j < tempMatrix.length; j++) {
tempMatrix[i][j] = (int) (Math.random() * 2);
}
}
synchronized (this) {
for (int k = 0; k < tempMatrix.length; k++) {
for (int j = 0; j < tempMatrix.length; j++) {
System.out.print("[" + tempMatrix[k][j] + "]");
}
System.out.println();
}
System.out.println("-----------------------------------------------
");

matrices.add(tempMatrix);
}
}
}

最佳答案

原因matrices类中为空Main是因为你从来没有向其中添加任何东西。您创建 2 个名为 matrices 的变量, Main 中的一, GenerateMatrices 中的一.如果你看Main ,您调用:

Queue<int[][]> matrices = new LinkedList<int[][]>();

然后你就再也不会使用它了,所以它仍然是空的。但是如果您调用GenerateMatrices.getMatrices().length ,它应该是非零(假设您定义 getMatrices()

至于为什么它打印得很奇怪,下面的答案应该有帮助:Java: System.out.println and System.err.println out of order

简而言之,调用System.out.println()由于系统调用的开销很高,因此不会立即写入输出。相反,它们被写入缓冲区,并且当 JVM 很高兴在不久的将来不会有更多数据到达时,缓冲区的内容就会被写入输出。 System.out.flush()迫使这个过程更快地发生,这可能会帮助您满足您的需要。

或者,不使用 synchronized (this) {...}您可以使用syncrhonized (System.out) {...}以确保没有交错。

附注

GenerateMatrices.matrices可能不应该是静态的。如果您创建 GenerateMatrices 的多个实例,您可能希望他们拥有 matrices 的单独副本。如果没有,您可能应该创建一个类,例如 MatrixStore弄清楚发生了什么。

关于Java - 当我尝试打印时线程池同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57523056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com