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. etc/sudoers配置文件详解-(转自xoker)

    从编写 sudo 配置文件/etc/sudoers开始: sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示 ...

  2. rpm命令的简介(2)-(转自 青春乐园 )

    青春乐园 怎样查看rpm安装包的安装路径 rpm -qpl xxxxxx.rpm 1.如何安装rpm软件包 rmp软件包的安装可以使用程序rpm来完成.执行下面的命令 rpm -i your-pack ...

  3. 面试官问:ZooKeeper 有几种节点类型?别再说 4 种啦!

    本文作者:HelloGitHub-老荀 好久没更新 ZK 的文章了,我想死你们啦.之前发布的 HelloZooKeeper 系列文章完结后,项目收获了将近 600 个 star.这远远超过了我自己的预 ...

  4. Mybatis基础使用方法

    1.首先在数据库中建立一张表 create table login( name varchar(20) not null, username varchar(20) not null, passwor ...

  5. VLAN与三层交换机

    VLAN概述与优势 ①分割广播域 物理分割 逻辑分割 ②VLAN的优势 控制广播 增强网络安全性 简化网络管理 VLAN的范围 VlAN  ID范围 范围 用途 0,4095 保留 仅限系统使用,用户 ...

  6. 简单理解数据库连接池(JDBC)

    为什么要使用连接池? 在我们写代码的时候,写了很多类,假如这些类都和数据库打交道.这样的话每个类都要去获取数据库连接,操作完了之后就把连接释放了. 要知道,获取数据库连接的操作其实是向操作系统底层去获 ...

  7. 对标 Spring Boot & Cloud ,轻量框架 Solon 1.4.14 发布

    Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...

  8. 『居善地』接口测试 — 11、接口签名sign原理

    目录 1.什么是加密以及解密? 2.加密方式的分类 (1)对称加密 (2)非对称加密 (3)总结: 3.接口签名sign原理 (1)什么是接口签名? (2)为什么需要做接口签名 (3)接口签名的实践方 ...

  9. UF_MTX 矩阵操作

    Open C   UF_MTX2_copyUF_MTX2_determinantUF_MTX2_identityUF_MTX2_initializeUF_MTX2_multiplyUF_MTX2_mu ...

  10. 从 SQL 到 MongoDB,这一篇就够了

    很多开发者首次接触数据库(通常是在高校课堂)的概念,或者说接触第一个数据库,通常是 SQL 数据库,而现在,NoSQL 数据库后来居上,很多原 SQL 数据的使用者难免有转向 NoSQL 的需求.而作 ...