【发布时间】:2015-09-03 09:19:56
【问题描述】:
我正在尝试创建一个带有用于矩阵乘法的线程的 Java 程序。这是源代码:
import java.util.Random;
public class MatrixTest {
//Creating the matrix
static int[][] mat = new int[3][3];
static int[][] mat2 = new int[3][3];
static int[][] result = new int[3][3];
public static void main(String[] args) {
//Creating the object of random class
Random rand = new Random();
//Filling first matrix with random values
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[i].length; j++) {
mat[i][j] = rand.nextInt(10);
}
}
//Filling second matrix with random values
for (int i = 0; i < mat2.length; i++) {
for (int j = 0; j < mat2[i].length; j++) {
mat2[i][j] = rand.nextInt(10);
}
}
try {
//Object of multiply Class
Multiply multiply = new Multiply(3, 3);
//Threads
MatrixMultiplier thread1 = new MatrixMultiplier(multiply);
MatrixMultiplier thread2 = new MatrixMultiplier(multiply);
MatrixMultiplier thread3 = new MatrixMultiplier(multiply);
//Implementing threads
Thread th1 = new Thread(thread1);
Thread th2 = new Thread(thread2);
Thread th3 = new Thread(thread3);
//Starting threads
th1.start();
th2.start();
th3.start();
th1.join();
th2.join();
th3.join();
} catch (Exception e) {
e.printStackTrace();
}
//Printing the result
System.out.println("\n\nResult:");
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[i].length; j++) {
System.out.print(result[i][j] + " ");
}
System.out.println();
}
}//End main
}//End Class
//Multiply Class
class Multiply extends MatrixTest {
private int i;
private int j;
private int chance;
public Multiply(int i, int j) {
this.i = i;
this.j = j;
chance = 0;
}
//Matrix Multiplication Function
public synchronized void multiplyMatrix() {
int sum = 0;
int a = 0;
for (a = 0; a < i; a++) {
sum = 0;
for (int b = 0; b < j; b++) {
sum = sum + mat[chance][b] * mat2[b][a];
}
result[chance][a] = sum;
}
if (chance >= i)
return;
chance++;
}
}//End multiply class
//Thread Class
class MatrixMultiplier implements Runnable {
private final Multiply mul;
public MatrixMultiplier(Multiply mul) {
this.mul = mul;
}
@Override
public void run() {
mul.multiplyMatrix();
}
}
我刚刚在 Eclipse 上尝试过,它可以工作,但现在我想创建该程序的另一个版本,在该版本中,我为结果矩阵上的每个单元格使用一个线程。例如,我有两个 3x3 矩阵。所以结果矩阵将是 3x3。然后,我想用 9 个线程来计算结果矩阵的 9 个单元中的每一个。
谁能帮帮我?
【问题讨论】:
-
我相信有人可以帮助你!他们在帮助您实现什么目标?
-
我需要一些关于线程同步的帮助,因为在这种情况下我只使用 3 个线程。在另一个程序中,我想为每个单元使用 9 个或更多线程(当我的矩阵大于 3x3 时)一个。我认为我需要创建一个单元类,但目前我没有其他想法
-
那么您是否正在寻找一种方法来创建
n线程,其中n是单元格的数量? -
那么你想创建一个线程来计算矩阵的单个单元格吗?分解您的程序,使其具有可以计算单个单元格的函数调用,然后像上面对整个矩阵所做的那样从多个线程调用它。注意不要指望它运行得很快,线程的重量很重,您将遭受 CPU 缓存中的错误共享。由于 CPU 内部的并行性以及来自 Hotspot 的 SIMD 指令越来越多的使用,您已经拥有的版本比您可能意识到的更多并发。
-
考虑一下这是一个准备考试的练习 :) 感谢您的合作 :)
标签: java multithreading matrix concurrency matrix-multiplication