我使用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);
}
}
}
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);
}
}
}
答案 0 :(得分:0)
在类matrices
中Main
为空的原因是,您从不添加任何内容。您创建了两个名为matrices
的变量,一个为Main
,一个为GenerateMatrices
。如果您查看Main
,则调用:
Queue<int[][]> matrices = new LinkedList<int[][]>();
然后您再也不会使用它,因此它保持为空。但是,如果您调用了GenerateMatrices.getMatrices().length
,则它应该为非零值(假设您定义了getMatrices()
。
关于为什么奇怪地打印,以下SO答案应该有帮助:Java: System.out.println and System.err.println out of order
简而言之,由于系统调用的高开销,对System.out.println()
的调用不会立即写入输出。取而代之的是,将它们写入缓冲区,并且当JVM满意不久以后不会再有更多缓冲区到达时,会将缓冲区的内容写入输出。 System.out.flush()
迫使此过程尽快发生,这可能会帮助您满足需要。
或者,可以使用synchronized (this) {...}
来确保不进行交织,而不是使用syncrhonized (System.out) {...}
。
P.S。
GenerateMatrices.matrices
可能不应该是静态的。如果创建GenerateMatrices
的多个实例,则可能希望它们具有matrices
的单独副本。如果不是这样,您可能应该创建一个诸如MatrixStore
之类的类,以明确正在发生的事情。