Параллельное программирование на Java - PullRequest
36 голосов
/ 28 июля 2010

Как мы можем сделать параллельное программирование на Java?Есть ли какие-то специальные рамки для этого?Как мы можем заставить вещи работать?

Я скажу вам, ребята, что мне нужно, подумайте, что я разработал веб-сканер, и он сканирует много данных из Интернета.Одна сканирующая система не будет работать правильно, поэтому мне нужно больше систем, работающих параллельно.Если это так, могу ли я применить параллельные вычисления?Ребята, вы можете привести пример?

Ответы [ 19 ]

18 голосов
/ 28 июля 2010

Если вы спрашиваете о чистом параллельном программировании , т.е. не параллельном программировании, то вам определенно следует попробовать 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 (). И отправитель, и получатель указывают тег, который используется для поиска соответствующих входящих сообщений на стороне получателя.

После инициализации библиотеки MPJ Express с использованием метода MPI.Init (args) в строке 12 программа получает свой ранг и размер коммуникатора MPI.COMM_WORLD. Оба процесса инициализируют целочисленный массив длиной 10, называемый буфером в строке 18. Процесс отправителя - ранг 0 - сохраняет значение 10 в первом элементе массива msg. Вариант метода Send () используется для отправки элемента массива msg процессу-получателю.

Процесс отправителя вызывает метод Send () в строке 27. Первые три аргумента относятся к отправляемым данным. Отправляющий буфер - массив буферов - это первый аргумент, за которым следуют 0 (o! Set) и 1 (count). Отправляемые данные имеют тип MPI.INT, а назначение - 1 (переменная однорангового узла); тип данных и место назначения указываются в качестве четвертого и пятого аргумента метода Send (). Последний и шестой аргумент - это переменная тега. Тег используется для идентификации сообщений на стороне получателя. Тег сообщения обычно является идентификатором конкретного сообщения в конкретном коммуникаторе. С другой стороны, процесс получателя (ранг 1) получает сообщение, используя метод получения блокировки.

9 голосов
/ 28 июля 2010

Java поддерживает потоки, поэтому вы можете иметь многопоточное Java-приложение.Я настоятельно рекомендую Параллельное программирование на Java: принципы проектирования и шаблоны Книга для этого:

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

8 голосов
/ 28 июля 2010

Вы хотите взглянуть на Java Parallel Processing Framework ( JPPF )

7 голосов
/ 29 июля 2010

Вы можете взглянуть на Hadoop и Hadoop Wiki . Это апач-фреймворк, созданный на основе google map-reduce. Он позволяет вам выполнять распределенные вычисления с использованием нескольких систем. Многие такие компании, как Yahoo, Twitter используют его ( Сайты на основе Hadoop ). Проверьте эту книгу для получения дополнительной информации о том, как его использовать Книга Hadoop .

3 голосов
/ 28 июля 2010

Это ресурс параллельного программирования, на который я указывал в прошлом:

http://www.jppf.org/

Я понятия не имею, хорошо это или нет, просто кто-то рекомендовал это некоторое время назад.

2 голосов
/ 28 июля 2010

Насколько я знаю, в большинстве операционных систем механизм потоков Java должен основываться на реальных потоках ядра. Это хорошо с точки зрения параллельного программирования. Другие языки, такие как Python, просто выполняют временное мультиплексирование процессора (а именно, если вы запустите тяжелое многопоточное приложение на многопроцессорной машине, вы увидите, что работает только один процессор).

Вы можете легко найти что-то, просто погугливая это: на примере это первый результат для "java threading": http://download -llnw.oracle.com / JavaSE / учебник / Эфирные / параллелизм /

По сути, это сводится к расширению класса Thread, перегрузке метода «run» кодом, принадлежащим другому потоку, и вызову метода «start» для экземпляра расширенного вами класса.

Также, если вам нужно что-то сделать потокобезопасным, взгляните на синхронизированные методы .

2 голосов
/ 28 июля 2010

пакет java.util.concurrency и книга Брайана Гетца «Параллелизм Java на практике»

Здесь также много ресурсов о параллельных шаблонах Ральфа Джонсона (одного из авторов шаблонов проектирования GoF): http://parlab.eecs.berkeley.edu/wiki/patterns/patterns

2 голосов
/ 28 июля 2010

В Java параллельная обработка выполняется с использованием потоков, которые являются частью библиотеки времени выполнения

В Учебнике по параллелизму следует ответить на множество вопросов по этой теме, если вы новичок в Java ипараллельное программирование.

2 голосов
/ 28 июля 2010

Является ли Ateji PX параллельным циклом для того, что вы ищете?Это будет обходить все сайты параллельно (обратите внимание на двойную полосу рядом с ключевым словом for):

for||(Site site : sites) {
  crawl(site);
}

Если вам нужно составить результаты сканирования, то вы, вероятно, захотите использовать параллельное понимание,такие как:

Set result = set for||{ crawl(site) | Site site : sites }

Подробнее читайте здесь: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf

2 голосов
/ 28 июля 2010

Я слышал об одном на конференции несколько лет назад - ParJava .Но я не уверен в текущем статусе проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...