Java多线程实现二维数组相乘

之前看到有人在网上询问如何用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;
	}

}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值