当前位置:  开发笔记 > 编程语言 > 正文

Java中的并行编程

如何解决《Java中的并行编程》经验,为你挑选了4个好方法。

我们如何在Java中进行并行编程?那有什么特别的框架吗?我们怎样才能使这些东西有效?

我会告诉你们我需要什么,认为我开发了一个网络爬虫,它从互联网爬行很多网站,一个系统爬行不会让事情正常工作,所以我们需要1000个系统来工作,如果这是我可以应用并行计算吗?你们能给我一个正确的例子吗?



1> Adil Mehmood..:

如果你问的是纯并行编程,不是并发编程,那么你一定要尝试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通信器的大小.两个进程初始化一个长度为10的整数数组,在第18行称为缓冲区.发送方进程级别0 - 在msg数组的第一个元素中存储值10.Send()方法的变体用于将msg数组的元素发送到接收方进程.

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



2> Manuel Selva..:

Java支持线程,因此您可以拥有多线程Java应用程序.我强烈推荐Java中并发编程:设计原则和模式书:

http://java.sun.com/docs/books/cp/



3> John Channin..:

您想要查看Java并行处理框架(JPPF)



4> Emil..:

你可以看一下Hadoop和Hadoop Wiki.这是一个灵感来自google map -reduce的apache框架.它使你能够使用多个系统进行分布式计算.很多公司如Yahoo,Twitter使用它(Sites Powered by Hadoop).查看这本书有关如何使用它的更多信息Hadoop Book.


你在RapidShare盗版上链接的那本书吗?
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有