11. O QUE PARALELIZAR?
• Tarefas Independentes com processamento pesado
Thursday, December 6, 12
12. O QUE PARALELIZAR?
• Tarefas Independentes com processamento pesado
• Processar mensagens de uma fila
Thursday, December 6, 12
13. O QUE PARALELIZAR?
• Tarefas Independentes com processamento pesado
• Processar mensagens de uma fila
• Conversão de dados
Thursday, December 6, 12
14. O QUE PARALELIZAR?
• Tarefas Independentes com processamento pesado
• Processar mensagens de uma fila
• Conversão de dados
• Aplicar filtros em imagens
Thursday, December 6, 12
20. OS DADOS
• 1;1;04122012;fichario preto;9;33.55
Thursday, December 6, 12
21. OS DADOS
• 1;1;04122012;fichario preto;9;33.55
Thursday, December 6, 12
22. OS DADOS
• 1;1;04122012;fichario preto;9;33.55
{
"number": 1,
"terminal": 1,
"description": "fichario preto",
"price": 33.55,
"date": "04122012"
}
Thursday, December 6, 12
23. PASSO A PASSO
• Ler os dados do CSV e converter para objetos.
• Para cada objeto, converter em Json.
• Adicionar o Json em uma lista de String.
• Gravar o conteúdo da lista em um arquivo.
Thursday, December 6, 12
24. SINGLE THREAD
• Processar tudo sequencialmente em um loop
• Implementação mais simples
Thursday, December 6, 12
25. CÓDIGO....
public List<String> toJson(List<?> list) {
List<String> lines = new ArrayList<>();
for (Object value : list) {
lines.add(new JsonObject(value)
.toString());
}
return lines;
}
Thursday, December 6, 12
26. TESTANDO
•1 milhão de registros
• Executar 10 vezes seguidas cada método.
• Desconsiderar o menor e o maior tempo.
• Obter o tempo médio.
Thursday, December 6, 12
27. TEMPO
Tempo
Método
Médio (ms)
Single 5562
Thursday, December 6, 12
37. protected List<String> convertToJson(List<Sale> sales){
int size = sales.size();
int amount = size / NUMBER_OF_THREADS; //4
int beginIndex = 0;
int finalIndex = amount;
List<Thread> threads = new ArrayList<>();
List<String> jsons = Collections.synchronizedList(
new ArrayList<String>());
while (true) {
//Cria uma nova thread para cada parte
}
Thursday, December 6, 12
44. DIFICULDADES
• Decidir a quantidade de Threads
Thursday, December 6, 12
45. DIFICULDADES
• Decidir a quantidade de Threads
• Dividir o trabalho
Thursday, December 6, 12
46. DIFICULDADES
• Decidir a quantidade de Threads
• Dividir o trabalho
• Juntar tudo no final
Thursday, December 6, 12
47. protected List<String> convertToJson(List<Sale> sales){
int size = sales.size();
int amount = size / NUMBER_OF_THREADS; //4
int beginIndex = 0;
int finalIndex = amount;
List<Thread> threads = new ArrayList<>();
List<String> jsons = Collections.synchronizedList(
new ArrayList<String>());
while (true) {
//Cria uma nova thread para cada parte
}
Thursday, December 6, 12
50. FORK / JOIN
• Java 7
• Dividir tarefas entre múltiplos processadores
Thursday, December 6, 12
51. FORK / JOIN
• Java 7
• Dividir tarefas entre múltiplos processadores
• Tarefas que podem ser quebradas recursivamente
Thursday, December 6, 12
52. COMO FUNCIONA
class ExemploForkJoin extends RecursiveTask<Long>{
@Override
protected Long compute() {
if(qtdeDeDados < LIMITE){
// execute a tarefa
}else{
//Divida o trabalho entre subtarefas
//Execute as subtarefas e espere o resultado
}
}
}
Thursday, December 6, 12
76. }else{
JsonTask left =
new JsonTask(list.subList(0, size / 2));
}
Thursday, December 6, 12
77. }else{
JsonTask left =
new JsonTask(list.subList(0, size / 2));
JsonTask right =
new JsonTask(list.subList(size / 2, size));
}
Thursday, December 6, 12
78. }else{
JsonTask left =
new JsonTask(list.subList(0, size / 2));
JsonTask right =
new JsonTask(list.subList(size / 2, size));
left.fork();
}
Thursday, December 6, 12
79. }else{
JsonTask left =
new JsonTask(list.subList(0, size / 2));
JsonTask right =
new JsonTask(list.subList(size / 2, size));
left.fork();
right.fork();
}
Thursday, December 6, 12
80. }else{
JsonTask left =
new JsonTask(list.subList(0, size / 2));
JsonTask right =
new JsonTask(list.subList(size / 2, size));
left.fork();
right.fork();
jsons.addAll(right.join());
jsons.addAll(left.join());
}
Thursday, December 6, 12
117. A ORDEM DAS CHAMADAS
• Ordem das chamadas é importante.
• Perde todo o paralelismo
Thursday, December 6, 12
118. left.fork();
long rightAns = right.compute();
long leftAns = left.join();
return leftAns + rightAns;
P
P
L R
Thursday, December 6, 12
119. left.fork();
long rightAns = right.compute();
long leftAns = left.join();
return leftAns + rightAns;
P L
P
fork()
L R
Thursday, December 6, 12
120. left.fork();
long rightAns = right.compute();
long leftAns = left.join();
return leftAns + rightAns;
R L
P
fork() compute()
L R
Thursday, December 6, 12
121. left.fork();
long rightAns = right.compute();
long leftAns = left.join();
return leftAns + rightAns;
P L
P
return
fork() compute()
L R
Thursday, December 6, 12
122. left.fork();
long rightAns = right.compute();
long leftAns = left.join();
return leftAns + rightAns;
P
P
join() return
fork() compute()
L R
Thursday, December 6, 12
123. left.fork();
long rightAns = right.compute();
long leftAns = left.join();
return leftAns + rightAns;
Thursday, December 6, 12
124. left.fork();
long leftAns = left.join();
long rightAns = right.compute();
return leftAns + rightAns;
Thursday, December 6, 12
125. left.fork();
long leftAns = left.join();
long rightAns = right.compute();
return leftAns + rightAns;
P
P
L R
Thursday, December 6, 12
126. left.fork();
long leftAns = left.join();
long rightAns = right.compute();
return leftAns + rightAns;
P L
P
fork()
L R
Thursday, December 6, 12
127. left.fork();
long leftAns = left.join(); Bloqueia a thread!
long rightAns = right.compute();
return leftAns + rightAns;
P L
P
fork()
L R
Thursday, December 6, 12
128. left.fork();
long leftAns = left.join();
long rightAns = right.compute();
return leftAns + rightAns;
P L
P
join()
fork()
L R
Thursday, December 6, 12
129. left.fork();
long leftAns = left.join();
long rightAns = right.compute();
return leftAns + rightAns;
R
P
join()
fork() compute()
L R
Thursday, December 6, 12
130. left.fork();
long leftAns = left.join();
long rightAns = right.compute();
return leftAns + rightAns;
R
P
join() return
fork() compute()
L R
Thursday, December 6, 12
131. left.fork();
long leftAns = left.join();
long rightAns = right.compute();
return leftAns + rightAns;
P
P
join() return
fork() compute()
L R
Thursday, December 6, 12
132. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
Thursday, December 6, 12
133. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
P
P
L R
Thursday, December 6, 12
134. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
P
P
compute()
L R
Thursday, December 6, 12
135. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
R
P
compute()
L R
Thursday, December 6, 12
136. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
R
P
return
compute()
L R
Thursday, December 6, 12
137. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
P
P
return
compute()
L R
Thursday, December 6, 12
138. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
P L
P
return
fork() compute()
L R
Thursday, December 6, 12
139. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
P L
P
return
fork() compute()
L R
Thursday, December 6, 12
140. long rightAns = right.compute();
left.fork();
long leftAns = left.join();
return leftAns + rightAns;
P
P
join() return
fork() compute()
L R
Thursday, December 6, 12
141. long rightAns = right.compute();
left.fork(); Executa
long leftAns = left.join(); Sequencialmente
return leftAns + rightAns;
P
P
join() return
fork() compute()
L R
Thursday, December 6, 12
142. left.fork();
long rightAns = right.compute();
long leftAns = left.join();
return leftAns + rightAns;
Thursday, December 6, 12