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实验项目四——多线程矩阵相乘算法的设计的更多相关文章

  1. Strassen 矩阵相乘算法(转)

    偶尔在算法课本上面看到矩阵相乘的算法,联想到自己曾经在蓝桥杯系统上曾经做过一道矩阵相乘的题目,当时用的是普通的矩阵相乘的方法,效率极低,勉强通过编译.所以决定研究一下Strassen矩阵相乘算法,由于 ...

  2. 第六周学习总结&java实验报告四

    第六周学习总结&java实验报告四 学习总结: 上一周因为接近国庆假期,所以老师没有讲太多的新知识点,只要是带我们一起做了一个动物模拟变声器的实验,进一步了解和学习到继承的 有关知识点和应用: ...

  3. 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 ...

  4. java实验项目报告

            JAVA课程项目报告   题目:利用java实现一个时钟的小程序 姓名:王国梁 班级:计科13-2 学号:201303011200         利用JAVA实现一个时钟的小程序 1 ...

  5. C语言 · 矩阵相乘 · 算法提高

    算法提高 矩阵相乘   时间限制:1.0s   内存限制:256.0MB      问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然 ...

  6. JAVA实验报告四及第六周总结

    JAVA第六周作业 实验报告四 第一题 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆的半径. 2.圆类Circle的方法成员: Circle():构造 ...

  7. 第六周课程总结&java实验报告四

    第六周课程总结: 一.instanceof关键字 1.作用:在Java中可以使用instanceof关键字判断一个对象到底是哪个类的实例. 2.格式:对象 instanceof 类 -> 返回b ...

  8. Java实验项目三——平面图形和立体图形抽象类

    Program:按照下面要求完成类的设计 (1)设计一个平面图形抽象类和一个立体图形抽象类,提供该类对象公共的方法和属性. (2)修改项目三中第2题中所设计的球类.圆柱类,圆锥类.矩形类.三角形类.圆 ...

  9. Java高级项目实战03:CRM系统数据库设计

    接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...

随机推荐

  1. [leetcode] 44. 通配符匹配(Java)(动态规划)

    44. 通配符匹配 动态规划 做动态规划很简单,三步走: 第一步,判断可否用动态规划做,即判断是否满足两个条件:①最优子结构,②重叠子问题.显然该题求s与p是否match,可由其字串层层分解上来. 我 ...

  2. Torchvision模型微调

    Torchvision模型微调 本文将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的magenet数据集上训练完成.将深入介绍如何使用几个现代的C ...

  3. KITTI数据集上MaskRCNN检测效果示例

    KITTI数据集上MaskRCNN检测效果示例 在Semantic Instance Segmentation Evaluation中,MaskRCNN性能效果排名第一. Test Image 0 I ...

  4. 视频处理器为电池供电的设计提供4K视频编码

    视频处理器为电池供电的设计提供4K视频编码 Video processor enables 4K video coding for battery-powered designs OmniVision ...

  5. mysql表ERROR 144 (HY000)Table 'dede_archives' is marked

    1.故障现象 mysql> select count(*) from dede_archives;ERROR 144 (HY000): Table '.xx' is marked as cras ...

  6. 1-3. SpringBoot基础,Java配置(全注解配置)取代xml配置

    最近突发奇想,整合一下以前一些学习笔记,分享自己这几年爬过的坑,逐步更新文章,谢谢大家的关注和支持. 这节讲一下SpringBoot的学习必须的一些基础,Java配置.其实在Spring2.0时代就已 ...

  7. JDBC连接MongoDB

    pom文件中导入驱动 <!-- MongoDB驱动 --> <dependency> <groupId>org.mongodb</groupId> &l ...

  8. Django(64)频率认证源码分析与自定义频率认证

    前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...

  9. 09:CBV与settings

    CBV源码 # 切入点 url(r'^login/', views.Mylogin.as_view()) '''类名点名字还加括号 名字要么是绑定给类的方法 要么是无参函数''' ​ 1.as_vie ...

  10. Java设计模式(5:设计模式的分类及工厂模式详解)

    一.设计模式的分类 总的来说,设计模式可以分为三大类:创建型模式.结构型模式.行为型模式,具体如下图: 二.工厂模式 工厂模式分为简单工厂模式.工厂方法模式和抽象工厂模式.其中简单工厂模式并不属于23 ...