之前看到有人在网上询问如何用Java多多线程实现二维数组的乘法。于是回去仔细思考了一下,实现出来分享一下。
首选我使用的是Runnable接口。将乘法运算部分放入run()中。
package com.thread.arr;
public class ArrThread implements Runnable {
public void run() {
//System.out.println(Thread.currentThread().getName());
// TODO Auto-generated method stub
Position p = MultiThreadArr.getPosition();
int x = p.x;
int y = p.y;
//System.out.println(x+","+y);
if(x<MultiThreadArr.m&&y<MultiThreadArr.l){
for(int k=0; k<MultiThreadArr.n; k++){
MultiThreadArr.Arrc[x][y]+= MultiThreadArr.Arra[x][k]*MultiThreadArr.Arrb[k][y];
}
//System.out.println(Thread.currentThread().getName()+"->"+MultiThreadArr.Arrc[x][y]);
}
}
}
主函数类如下:每个线程计算结果数组中的一个值。
package com.thread.arr;
import java.io.ObjectInputStream.GetField;
public class MultiThreadArr {
static int m;
static int n;
static int l;
private static Position p;
private static int LEN = 4;
static int Arra[][];
static int Arrb[][];
static int Arrc[][];
private static void fillArr(int Arr[][]){
for(int i=0; i<Arr.length; i++)
for(int j=0; j<Arr[i].length; j++){
Arr[i][j] = i+j;
}
}
private static void printArr(int Arr[][]){
for(int i=0; i<Arr.length; i++){
for(int j=0; j<Arr[i].length; j++){
System.out.print(Arr[i][j]+" ");
}
System.out.println("");
}
}
public static synchronized Position getPosition(){
p.y++;
if(p.y>=l){
p.x++;
p.y=0;
}
return p;
}
public static void SingleThread(int[][] a, int[][] b, int[][] c){
for(int i=0; i<c.length; i++)
for(int j=0; j<c[i].length; j++){
for(int k=0; k<b.length; k++)
c[i][j]+= a[i][k]*b[k][j];
}
}
public static void main(String[] args) throws InterruptedException {
m = 2;
n = 3;
l = 4;
p = new Position();
Arra = new int[m][n];
Arrb = new int[n][l];
Arrc = new int[m][l];
fillArr(Arra);
fillArr(Arrb);
printArr(Arra);
printArr(Arrb);
//SingleThread(Arra, Arrb, Arrc);
for(int i=0; i<m*l; i++){
Thread t = new Thread(new ArrThread());
t.start();
}
Thread.sleep(20);
printArr(Arrc);
}
}
还增加了一个Position类,作为同步的位置信息类
package com.thread.arr;
public class Position {
int x;
int y;
public Position() {
// TODO Auto-generated constructor stub
this.x = 0;
this.y = -1;
}
}