我有一个要求,我不确定是否可以通过使用线程来实现。我有两个预定义的100 * 100矩阵,我想执行它们的乘法运算。我想要的是,不是简单的乘法,但我想把它分成三个独立的程序,第一个程序将执行前33行的乘法,第二个程序将执行从33到64的乘法,第三个将乘以64到100的乘法现在我想并行运行这些程序并收集它们的结果(即行的乘法),然后将这三个不同的结果连接成一个矩阵。 现在,我已经开发了三个这样的程序或类,但我无法找到任何方法来并行运行它们。 在线程中,我读到我们无法确定哪个线程将首先执行,哪个线程将在稍后执行。
任何人都可以告诉我,我可以使用哪种技术解决我的问题?
我将非常感谢你们。
答案 0 :(得分:2)
Java内置了这种东西。文档为http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html
创建每个对象,将其抛出到线程池中,然后全部运行它们。
ExecutorService service = Executors.newFixedThreadPool(3);
service.submit(matrixMult1);
service.submit(matrixMult2); // the objects that do the work
service.submit(matrixMult3);
service.shutdown();
service.awaitTermination(1, TimeUnit.HOURS);
这是基本概要。
答案 1 :(得分:1)
对于这种情况,我会使用已经存在的库,例如EJML(http://code.google.com/p/efficient-java-matrix-library/)或la4j(http://la4j.org)。在所有可能的情况下,图书馆将更快地产生结果。你也可以转向更适合数学的不同语言,但我认为这不属于这个问题的范围。如果你坚持使用线程,因为它们都是并行运行的,那么首先完成的任何事情都没有任何意义,你只需要确保它们全部完成然后重新组装。
希望有所帮助
答案 2 :(得分:1)
Here's a parallel java library我在大学里用于大多数并行java项目。
它是由我的并行编程教授Alan Kaminsky编写的,他很棒(一些学生也为此做出了贡献)。
下载页面上需要注意的重要事项:用法部分,文档部分和系统要求(特别是关于java 5如何比java 6或7更好地执行的部分)。
一个好的起点可能是edu.rit.pj.test.Test13
,它执行矩阵运算。
对于此实现非常重要的类是edu.rit.pj.Comm
,它负责线程之间的大多数数据传递。请务必阅读本课程的文档,特别注意broadcast()
和gather()
的各个部分,这些部分应该是您首次将矩阵分发到节点的方式,然后最终收集并合并结果
我知道,要吸收很多东西。我稍后会尝试写一个例子。
答案 3 :(得分:0)
我不相信100乘100是非常大的并且当并行完成时你不会看到大幅加速,这将是预优化的典型例子,特别是如果你的操作系统很忙。
其次你为什么要重新发明轮子呢?
jblas
http://mikiobraun.github.io/jblas/被认为是最快的BLAS
java库
如果您不发布代码,我们怎么能告诉您代码有什么问题?
但无论如何,我会根据使用 java concurrency api完成任务的完成任务给你一个答案:Executing Dependent tasks in parallel in Java
请检查出来。
这将为您提供另一个以您描述的方式解决此问题的示例,但我认为该方法比使用jblas更慢。