Параллельное программирование в Java

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

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

36
задан Daniel Perník 5 March 2019 в 16:33
поделиться

12 ответов

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

18
ответ дан 27 November 2019 в 05:57
поделиться

Прочтите раздел о потоках в руководстве по java. http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/procthread.html

1
ответ дан 27 November 2019 в 05:57
поделиться

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

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

2
ответ дан 27 November 2019 в 05:57
поделиться

Вы хотите взглянуть на платформу параллельной обработки Java ( JPPF )

9
ответ дан 27 November 2019 в 05:57
поделиться

Вам нужен параллельный цикл 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
ответ дан 27 November 2019 в 05:57
поделиться

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

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

2
ответ дан 27 November 2019 в 05:57
поделиться

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

Вы можете легко найти что-то, просто погуглите: например, это первый результат для "потоковой передачи Java": http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/

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

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

2
ответ дан 27 November 2019 в 05:57
поделиться

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

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

9
ответ дан 27 November 2019 в 05:57
поделиться

Возможно, вам стоит попробовать Hadoop. Он предназначен для работы с произвольным количеством ящиков и берет на себя всю бухгалтерию за вас. Он вдохновлен Google MapReduce и связанными с ними инструментами, и поэтому он даже исходит из веб-индексации.

1
ответ дан 27 November 2019 в 05:57
поделиться

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

2
ответ дан 27 November 2019 в 05:57
поделиться

Вы можете ознакомиться с Hadoop и Hadoop Wiki . Это фреймворк apache, вдохновленный map-reduce от Google. Он позволяет вам делать распределенные вычисления с использованием нескольких систем. Многие компании, такие как Yahoo, Twitter, используют его ( Sites Powered By Hadoop ). Дополнительную информацию о том, как его использовать, можно найти в этой книге Hadoop Book .

7
ответ дан 27 November 2019 в 05:57
поделиться

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

http://www.jppf.org/

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

3
ответ дан 27 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: