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组的设计稿, 接下来就要设计数据库, 一 ...
随机推荐
- elk搜集日志,实现logstash根据message中结构不同动态创建索引并扩展功能,区分message中json和非json数据简单方式
搜集日志,但是框架本身也会打印很多日志是字符串的.我们自己希望的日志用json,但是又需要json字段可以扩展,logstash收集日志后都放在了message字段中,我们自定义打印的是json串,s ...
- MyBatis 数据源的原理和机制
回顾JDBC JDBC访问数据库流程 加载驱动 获取Connection连接对象(消耗性能) 获取PrepareStatement对象 执行SQL语句 获取结果集 关闭Connection连接对象 存 ...
- SystemVerilog数组(一)
- 为何不选择lunix AIO
对于块设备而言,linux可以使用同步IO.POSIX IO.linux AIO.io-uring,前俩者是linux的同步IO接口,后者是linux内核提供的异步io接口,linux AIO只支持直 ...
- TaskManager任务管理工具类
TaskManager任务管理工具类 public class TaskManager { public static AbstractTask newTask(TaskContext taskIns ...
- MindSpore技术理解(下)
MindSpore技术理解(下) 4 GraphEngine 由于深度学习算法需要进行大量的计算,很多公司都设计了自己的深度学习专用处理器(如谷歌的张量处理器.阿里巴巴的含光等),华为也发布了自主设计 ...
- GPU编程和流式多处理器(六)
GPU编程和流式多处理器(六) 5. 纹理和表面 读取和写入纹理和表面的指令,所引用的隐式状态,比其他指令要多得多.header中包含诸如基地址,尺寸,格式和纹理内容的解释之类的参数,该header是 ...
- 编写可调模板并使用Auto-tuner自动调谐器
编写可调模板并使用Auto-tuner自动调谐器 本文介绍在TVM自动调谐模块. 自动调谐有两个步骤.第一步是定义搜索空间.第二步是运行一个搜索算法来探索这个空间.可以学习如何在TVM中执行这两个步骤 ...
- AMD Ryzen 5000‘Cezanne’APU
AMD Ryzen 5000'Cezanne'APU Spotted,Zen 3&7nm Vega芯片将在2021年前保留AM4支持 AMD Ryzen 5000 'Cezanne' APU ...
- matrix_multiply代码解析
matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...