Java运行并行程序

时间:2012-10-08 18:20:38

标签: java multithreading

我有一个要求,我不确定是否可以通过使用线程来实现。我有两个预定义的100 * 100矩阵,我想执行它们的乘法运算。我想要的是,不是简单的乘法,但我想把它分成三个独立的程序,第一个程序将执行前33行的乘法,第二个程序将执行从33到64的乘法,第三个将乘以64到100的乘法现在我想并行运行这些程序并收集它们的结果(即行的乘法),然后将这三个不同的结果连接成一个矩阵。 现在,我已经开发了三个这样的程序或类,但我无法找到任何方法来并行运行它们。 在线程中,我读到我们无法确定哪个线程将首先执行,哪个线程将在稍后执行。

任何人都可以告诉我,我可以使用哪种技术解决我的问题?

我将非常感谢你们。

4 个答案:

答案 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更慢。