Java-尝试打印时ThreadPool同步问题

时间:2019-08-16 10:31:21

标签: java multithreading synchronization threadpool

我使用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);
    }
}
}

1 个答案:

答案 0 :(得分:0)

在类matricesMain为空的原因是,您从不添加任何内容。您创建了两个名为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之类的类,以明确正在发生的事情。