当前位置: 首页 > 面试题库 >

Java并行编程

爱花蜂
2023-03-14
问题内容

我们如何用Java进行并行编程?有什么特殊的框架吗?我们如何使这些东西起作用?

我会告诉大家我需要什么,以为我开发了一个Web搜寻器,它可以从互联网上搜寻很多数据。一个爬网系统将无法正常工作,因此我需要更多的并行系统。如果是这种情况,我可以应用并行计算吗?你们能给我一个例子吗?


问题答案:

如果您询问纯 并行编程并发 编程),那么绝对应该尝试MPJExpress http://mpj-
express.org/
。它是mpiJava的线程安全实现,并且支持分布式和共享内存模型。我尝试过,发现非常可靠。

1 import mpi.*;  
2  
3 
/**  
4  * Compile:impl specific.  
5  * Execute:impl specific.  
6  */  
7  
8 public class Send {  
9 
10     public static void main(String[] args) throws Exception { 
11 
12         MPI.Init(args); 
13 
14         int rank = MPI.COMM_WORLD.Rank() ; //The current process.
15         int size = MPI.COMM_WORLD.Size() ; //Total number of processes
16         int peer ; 
17 
18         int buffer [] = new int[10]; 
19         int len = 1 ;
20         int dataToBeSent = 99 ; 
21         int tag = 100 ; 
22 
23         if(rank == 0) { 
24 
25             buffer[0] = dataToBeSent ; 
26             peer = 1 ; 
27             MPI.COMM_WORLD.Send(buffer, 0, len, MPI.INT, peer, tag) ; 
28             System.out.println("process <"+rank+"> sent a msg to "+ 29                                "process <"+peer+">") ; 
30 
31         } else if(rank == 1) { 
32 
33             peer = 0 ; 
34             Status status = MPI.COMM_WORLD.Recv(buffer, 0, buffer.length, 35                                                 MPI.INT, peer, tag); 
36             System.out.println("process <"+rank+"> recv'ed a msg\n"+ 37                                "\tdata   <"+buffer[0]    +"> \n"+ 38                                "\tsource <"+status.source+"> \n"+ 39                                "\ttag    <"+status.tag   +"> \n"+ 40                                "\tcount  <"+status.count +">") ; 
41 
42         } 
43 
44         MPI.Finalize(); 
45 
46     }  
47 
48 }

消息库(如MPJ
Express)提供的最常见功能之一是对执行进程之间的点对点通信的支持。在这种情况下,属于同一通信器(例如MPI.COMM_WORLD通信器)的两个进程可以通过发送和接收消息来相互通信。Send()方法的一种变体用于从发送方进程发送消息。另一方面,通过使用Recv()方法的变体,接收方进程将接收到已发送的消息。发送方和接收方都指定一个标签,该标签用于在接收方找到匹配的传入消息。

在第12行上使用MPI.Init(args)方法初始化MPJ
Express库之后,程序将获得其等级和MPI.COMM_WORLD通信器的大小。这两个进程都初始化了第18行上称为缓冲区的长度为10的整数数组。发送程序进程(等级为0)将值10存储在msg数组的第一个元素中。Send()方法的一种变体用于将msg数组的元素发送到接收器进程。

发送方进程在第27行调用Send()方法。前三个参数与要发送的数据有关。发送缓冲区(缓冲区数组)是第一个参数,后跟0(默认值)和1(计数)。发送的数据为MPI.INT类型,目标为1(对等变量);数据类型和目标被指定为Send()方法的第四和第五个参数。最后和第六个参数是标签变量。标签用于在接收方识别消息。消息标签通常是特定通信器中特定消息的标识符。另一方面,接收方进程(等级1)使用阻塞接收方法接收消息。



 类似资料:
  • 问题内容: 如何编译和运行以下程序: Test1.java: Test2.java: 我是新手。如果我使用编译 并手动创建目录A,则将Test1.class复制到其中,然后手动创建目录B,并将Test2.class复制到其中,然后运行它。我确信这不是正确的方法。请提出建议。 问题答案: 您需要将Java文件保留在正确的目录结构中: 通常仅在您的主类上调用就足够了,因为所有依赖项都将自动处理。我说了

  • 并行 理论上并行和语言并没有什么关系,所以在理论上的并行方式,都可以尝试用Rust来实现。本小节不会详细全面地介绍具体的并行理论知识,只介绍用Rust如何来实现相关的并行模式。 Rust的一大特点是,可以保证“线程安全”。而且,没有性能损失。更有意思的是,Rust编译器实际上只有Send Sync等基本抽象,而对“线程” “锁” “同步” 等基本的并行相关的概念一无所知,这些概念都是由库实现的。这

  • 问题内容: 我正在尝试反编译 Java项目(.jar)文件,并且能够从其中获取.java文件。现在如何将其编译回来?我可以将.java文件作为单个文件添加到Netbeans。但是如何将其作为项目添加并编译呢?该项目是JavaFX项目。所以请帮我。 问题答案: 有很多方法可以实现此目的,但是我认为您不能像这样直接在框内(在本例中为开箱)将项目导入jar中。 我们可以使用最基本的技术(我承认有点脏),

  • 全面记录了 Java 并发编程的相关知识,包括 Java 5 新增加的并发包内的相关类,分析了并发编程中的常见问题,并深入 Java 内存模型,对底层并发机制的实现做了一些分析。

  • 本章讲解 Rust 中,并发,并行,多线程编程的相关知识。

  • 进程和进程见通信都是Erlang以及所有并行编程中最基本的概念,进程的创建和进程间的通信都是显式进行的。 进程的创建 一个进程是一个独立自治的计算单元,它与系统中其他的进程并行地存在。进程之间没有继承的层次关系,不过应用程序的设计者也可以显式地创建这样一个层次关系。 BIF spawn/3创建并开始执行一个新的进程,它的参数和apply/3是一样的: Pid = spawn(Module, Fun