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. 回归(regression)与分类(classification)的区别

    术语监督学习,意指给出一个算法,需要部分数据集已经有正确的答案. " 分类和回归的区别在于输出变量的类型. 定量输出称为回归,或者说是连续变量预测:定性输出称为分类,或者说是离散变量预测. ...

  2. HarmonyOS之DevEco2中真实手机调试应用

    本文将带你了解如何在真机上调试HarmonyOS应用 本人按照官方文档执行,还是遇到几个问题,特此记录下 https://developer.harmonyos.com/cn/docs/documen ...

  3. 解决无法访问github的问题

    当我们想学习下载某个大神分享的github项目时,由于github域名解析异常,时常会无法访问Github网站. 下面是我总结分享的有效解决方法:思路是自己手动修改hosts文件添加域名解析! 下面教 ...

  4. skynet debug console 使用

    预读 关于如何使用 skynet 可以参考 wiki 文档 更多实战内容见 https://www.lanqiao.cn/courses/2770 优惠码:2CZ2UA5u 环境测试搭建 使用示例代码 ...

  5. Docker学习(3) 容器基本操作

    容器的基本操作

  6. Docker学习(2) 安装

    1 在Ubanru中安装 简单安装: 2 windows安装docker 3 OS X 安装docker

  7. nginx 重定向到系统维护页面

    上周末兄弟项目准备扩展服务器以便提供更好的服务,兄弟项目有一些功能是实时提供到我这边的,需要我这边暂时把对应系统功能屏蔽,因为使用nginx,所以可以直接配置nginx重定向到固定系统维护页面. ng ...

  8. a标签点击跳转到新窗口打开目标资源

    点击a标签跳转到新窗口打开目标资源, <a href="http://gd.zjtcn.com/facs/c_t_p1_圆钉 50-75.html" target=" ...

  9. Go benchmark 详解

    前言 基准测试(benchmark)是 go testing 库提供的,用来度量程序性能,算法优劣的利器. 在日常生活中,我们使用速度 m/s(单位时间内物体移动的距离)大小来衡量一辆跑车的性能,同理 ...

  10. CVPR2019论文解读:单眼提升2D检测到6D姿势和度量形状

    CVPR2019论文解读:单眼提升2D检测到6D姿势和度量形状 ROI-10D: Monocular Lifting of 2D Detection to 6D Pose and Metric Sha ...