Java实验项目四——多线程矩阵相乘算法的设计
Program:多线程矩阵相乘算法的设计
Description:利用多线程实现矩阵相乘,因为各个线程的运算互不影响,
所以不用使用锁,代码如下:
thread.OperateMatrix类,实现矩阵运算
1 /*
2 * Description:定义矩阵操作类
3 *
4 * Written By :Cai
5 *
6 * Date Written:2017-10-25
7 *
8 * */
9
10 package thread;
11
12 public class OperateMatrix {
13
14 int[][] matrix1 = null; //第一个矩阵
15 int[][] matrix2 = null; //第二个矩阵
16 int[][] result = null; //存放矩阵相乘结果
17 public static int line = 0; //记录当前参与计算的是第一个矩阵的第几行
18
19 //定义构造方法
20 public OperateMatrix() {}
21
22 public OperateMatrix(int[][] m1,int[][] m2) {
23
24 this.matrix1 = m1;
25 this.matrix2 = m2;
26 result = new int[matrix1.length][matrix2[0].length];
27 }
28
29 //返回矩阵相乘的结果
30 public int[][] getResult() {
31
32 try {
33
34 /*
35 * 当矩阵还没有完全计算完时
36 * 令当前线程睡眠1毫秒等待
37 * 然后再次判断
38 *
39 * */
40 while( OperateMatrix.line < matrix1.length ) {
41
42 Thread.sleep(1);
43
44 }
45 }catch(Exception e) {
46
47 e.printStackTrace();
48 }
49
50 return this.result;
51
52 }
53
54 //第一个矩阵的行乘以第二个矩阵的列,得到新矩阵的行
55 public void operate() {
56
57 OperateMatrix.line += 1; //记录行数加1
58
59 for( int i = 0; i < matrix1[0].length; i++ ) {
60
61 int sum = 0; //存储第一个矩阵的行和 第二个矩阵的列的计算结果
62 for( int j = 0; j < matrix2.length; j++ ) {
63
64 sum += matrix1[OperateMatrix.line - 1][j] * matrix2[j][i]; //第一个矩阵的当前行乘以第二个矩阵
65 }
66
67 result[OperateMatrix.line - 1][i] = sum; //保存结果
68 }
69
70 }
71 }
thread.ThreadOperate类,线程实现类
1 /*
2 * Description:定义类,继承Thread类,覆写run()方法
3 *
4 * Written By:Cai
5 *
6 * Date Written:2017-10-25
7 *
8 * */
9
10 package thread;
11
12 public class ThreadOperate extends Thread {
13
14 private OperateMatrix om = null; //定义矩阵操类对象
15
16 //定义构造方法
17 public ThreadOperate() {
18 super();
19 }
20
21 public ThreadOperate( OperateMatrix om,String name) {
22 super(name); //线程名字
23 this.om = om;
24 }
25
26 //覆写run()方法
27 @Override
28 public void run() {
29
30 try {
31 System.out.println( Thread.currentThread().getName() ); //打印当前线程的名字
32 }catch( Exception e ) {
33 e.printStackTrace();
34 }
35
36 /*
37 * 调用OperateMatrix对象的operate方法,进行矩阵的计算
38 * 每次调用只计算一行结果
39 *
40 * */
41 this.om.operate();
42 }
43
44 }
main.TestDemo测试类
1 /*
2 * Description:定义测试类
3 *
4 * Written By :Cai
5 *
6 * Date Written:2017-10-25
7 *
8 * */
9
10
11 package main;
12
13
14 import thread.*;
15
16 public class TestDemo {
17
18 public static void main(String args[]) {
19
20 //定义两个矩阵
21 int[][] m1 = {{1,4,1,1},{4,1,1,1},{1,3,3,6},{1,6,9,0}}; //4*4
22 int[][] m2 = {{2,2,2,2},{2,2,2,2},{2,2,2,2},{2,2,2,2}}; //4*4
23
24 OperateMatrix om = new OperateMatrix(m1,m2); //实例化OperateMatrix对象
25
26 //根据第一个矩阵的行数,启动对应数量的线程
27 for( int i = 0; i < m1.length; i++ ) {
28
29 new ThreadOperate( om,"计算第一个矩阵的第" + (i+1) + "行*第二个矩阵的所有列" ).start();
30 }
31
32
33 display(om.getResult()); //打印结果
34
35 }
36
37
38 //打印计算结果(为了方便,将打印方法定义在测试类中,实际不应该这样做)
39 public static void display(int[][] result) {
40
41 for( int i = 0; i < result.length; i++ ) {
42
43 for( int j = 0; j < result[i].length; j++ ) {
44
45 System.out.print( result[i][i] + "\t" );
46 }
47
48 System.out.println();
49 }
50 }
51
52 }
Java实验项目四——多线程矩阵相乘算法的设计的更多相关文章
- Strassen 矩阵相乘算法(转)
偶尔在算法课本上面看到矩阵相乘的算法,联想到自己曾经在蓝桥杯系统上曾经做过一道矩阵相乘的题目,当时用的是普通的矩阵相乘的方法,效率极低,勉强通过编译.所以决定研究一下Strassen矩阵相乘算法,由于 ...
- 第六周学习总结&java实验报告四
第六周学习总结&java实验报告四 学习总结: 上一周因为接近国庆假期,所以老师没有讲太多的新知识点,只要是带我们一起做了一个动物模拟变声器的实验,进一步了解和学习到继承的 有关知识点和应用: ...
- java 写一个 map reduce 矩阵相乘的案例
1.写一个工具类用来生成 map reduce 实验 所需 input 文件 下面两个是原始文件 matrix1.txt 1 2 -2 0 3 3 4 -3 -2 0 2 3 5 3 -1 2 -4 ...
- java实验项目报告
JAVA课程项目报告 题目:利用java实现一个时钟的小程序 姓名:王国梁 班级:计科13-2 学号:201303011200 利用JAVA实现一个时钟的小程序 1 ...
- C语言 · 矩阵相乘 · 算法提高
算法提高 矩阵相乘 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然 ...
- JAVA实验报告四及第六周总结
JAVA第六周作业 实验报告四 第一题 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆的半径. 2.圆类Circle的方法成员: Circle():构造 ...
- 第六周课程总结&java实验报告四
第六周课程总结: 一.instanceof关键字 1.作用:在Java中可以使用instanceof关键字判断一个对象到底是哪个类的实例. 2.格式:对象 instanceof 类 -> 返回b ...
- Java实验项目三——平面图形和立体图形抽象类
Program:按照下面要求完成类的设计 (1)设计一个平面图形抽象类和一个立体图形抽象类,提供该类对象公共的方法和属性. (2)修改项目三中第2题中所设计的球类.圆柱类,圆锥类.矩形类.三角形类.圆 ...
- Java高级项目实战03:CRM系统数据库设计
接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...
随机推荐
- 学习Git的一些总结
Git是以后公司工作必不可少的,所以早点了解使用它是很有必要的 一般国外的开源是GitHub 国内的是码云Gitee 至于git的安装教程,这里就不啰嗦啦,面向百度即可,安装完成鼠标右键会多几个选项: ...
- Oracle的Rman差异增量备份
所谓增量备份,顾名思义即是每次备份操作那些发生了"变化"的数据块.在RMAN增量备份中有两种:Differential(差异备份)和Cumulative(增量备份)方式.由于需求这 ...
- VAE变分自编码器实现
变分自编码器(VAE)组合了神经网络和贝叶斯推理这两种最好的方法,是最酷的神经网络,已经成为无监督学习的流行方法之一. 变分自编码器是一个扭曲的自编码器.同自编码器的传统编码器和解码器网络一起,具有附 ...
- PyTorch 自动微分
PyTorch 自动微分 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后将会去训练的第一个神经网络.该 autograd 软件包为 Tensors 上的所有操作提供 ...
- CodeGen CreateFile实用程序
CodeGen CreateFile实用程序 CreateFile实用程序允许根据存储库文件或结构定义创建ISAM文件. CreateFile实用程序的命令行选项如下: CreateFile -f & ...
- P1045 [NOIP2003 普及组] 麦森数
题目描述 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P−1不一定也是素数. 到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377, ...
- Halcon 纹理缺陷检测 apply_texture_inspection_model
在纹理中找瑕疵.基于高斯混合模型(GMM)分类器的纹理检查模型,适用于图像金字塔,可以分析纹理的多个频率范围. [要求]训练样本,必须完美无瑕疵. [步骤] 1.创建模型 create_texture ...
- SpringBoot2配置文件application.yaml
源码基于SpringBoot 2.4.4 1.认识配置文件 1.1 配置文件的加载 创建SpringBoot项目的时候,会自动创建一个application.properties文件,该文件是Spri ...
- daily plan
想了想自己留的坑有点多了,写个计划提醒自己 一些没做出来的题 csp-s模拟测试54 z csp-s模拟测试b层加餐 string 平衡树+并查集 因为某杰的**安排,没时间改了csp-s模拟测试47 ...
- 【模拟8.05】优美序列(线段树 分块 ST算法)
如此显然的线段树,我又瞎了眼了 事实上跟以前的奇袭很像....... 只要满足公式maxn-minn(权值)==r-l即可 所以可以考虑建两颗树,一棵节点维护位置,一棵权值, 每次从一棵树树上查询信息 ...