Facilitando a Programação concorrente com o Fork/Join

144
FACILITANDO A PROGRAMAÇÃO CONCORRENTE COM O FORK/JOIN Mário Amaral @mario_fts Thursday, December 6, 12

Transcript of Facilitando a Programação concorrente com o Fork/Join

Page 1: Facilitando a Programação concorrente com o Fork/Join

FACILITANDO A PROGRAMAÇÃO

CONCORRENTE COM O FORK/JOIN

Mário Amaral@mario_fts

Thursday, December 6, 12

Page 2: Facilitando a Programação concorrente com o Fork/Join

QUE MÁRIO?

Thursday, December 6, 12

Page 3: Facilitando a Programação concorrente com o Fork/Join

QUE MÁRIO?

•Desenvolvedor Java desde 2004

Thursday, December 6, 12

Page 4: Facilitando a Programação concorrente com o Fork/Join

QUE MÁRIO?

•Desenvolvedor Java desde 2004

• Instrutor na Caelum

Thursday, December 6, 12

Page 5: Facilitando a Programação concorrente com o Fork/Join

QUE MÁRIO?

•Desenvolvedor Java desde 2004

• Instrutor na Caelum

• Caelum-Stella

Thursday, December 6, 12

Page 6: Facilitando a Programação concorrente com o Fork/Join

QUE MÁRIO?

•Desenvolvedor Java desde 2004

• Instrutor na Caelum

• Caelum-Stella

• Personagem de games desde 1981

Thursday, December 6, 12

Page 7: Facilitando a Programação concorrente com o Fork/Join

VAMOS FALAR DE PARALELISMO

Thursday, December 6, 12

Page 8: Facilitando a Programação concorrente com o Fork/Join

POR QUE PARALELIZAR

• Ganhar tempo

Thursday, December 6, 12

Page 9: Facilitando a Programação concorrente com o Fork/Join

POR QUE PARALELIZAR

• Aproveitar recursos ociosos

Thursday, December 6, 12

Page 10: Facilitando a Programação concorrente com o Fork/Join

O QUE PARALELIZAR?

Thursday, December 6, 12

Page 11: Facilitando a Programação concorrente com o Fork/Join

O QUE PARALELIZAR?

• Tarefas Independentes com processamento pesado

Thursday, December 6, 12

Page 12: Facilitando a Programação concorrente com o Fork/Join

O QUE PARALELIZAR?

• Tarefas Independentes com processamento pesado

• Processar mensagens de uma fila

Thursday, December 6, 12

Page 13: Facilitando a Programação concorrente com o Fork/Join

O QUE PARALELIZAR?

• Tarefas Independentes com processamento pesado

• Processar mensagens de uma fila

• Conversão de dados

Thursday, December 6, 12

Page 14: Facilitando a Programação concorrente com o Fork/Join

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

Page 15: Facilitando a Programação concorrente com o Fork/Join

O PROBLEMA

Thursday, December 6, 12

Page 16: Facilitando a Programação concorrente com o Fork/Join

O PROBLEMA

• Conversão de dados

Thursday, December 6, 12

Page 17: Facilitando a Programação concorrente com o Fork/Join

O PROBLEMA

• Conversão de dados

•Dados de vendas

Thursday, December 6, 12

Page 18: Facilitando a Programação concorrente com o Fork/Join

O PROBLEMA

• Conversão de dados

•Dados de vendas

• CSV => JSON

Thursday, December 6, 12

Page 19: Facilitando a Programação concorrente com o Fork/Join

OS DADOS

Thursday, December 6, 12

Page 20: Facilitando a Programação concorrente com o Fork/Join

OS DADOS • 1;1;04122012;fichario preto;9;33.55

Thursday, December 6, 12

Page 21: Facilitando a Programação concorrente com o Fork/Join

OS DADOS • 1;1;04122012;fichario preto;9;33.55

Thursday, December 6, 12

Page 22: Facilitando a Programação concorrente com o Fork/Join

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

Page 23: Facilitando a Programação concorrente com o Fork/Join

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

Page 24: Facilitando a Programação concorrente com o Fork/Join

SINGLE THREAD

• Processar tudo sequencialmente em um loop

• Implementação mais simples

Thursday, December 6, 12

Page 25: Facilitando a Programação concorrente com o Fork/Join

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

Page 26: Facilitando a Programação concorrente com o Fork/Join

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

Page 27: Facilitando a Programação concorrente com o Fork/Join

TEMPO

Método Tempo Médio (ms)

Single 5562

Thursday, December 6, 12

Page 28: Facilitando a Programação concorrente com o Fork/Join

MULTI THREAD

Thursday, December 6, 12

Page 29: Facilitando a Programação concorrente com o Fork/Join

MULTI THREAD

• Cada conversão é independente da outra.

Thursday, December 6, 12

Page 30: Facilitando a Programação concorrente com o Fork/Join

MULTI THREAD

• Cada conversão é independente da outra.

• Múltiplos processadores

Thursday, December 6, 12

Page 31: Facilitando a Programação concorrente com o Fork/Join

MULTI THREAD

• Cada conversão é independente da outra.

• Múltiplos processadores

•Dividir e distribuir!

Thursday, December 6, 12

Page 32: Facilitando a Programação concorrente com o Fork/Join

threads.add(createANewThread(sales, jsons, beginIndex,finalIndex));

Thursday, December 6, 12

Page 33: Facilitando a Programação concorrente com o Fork/Join

threads.add(createANewThread(sales, jsons, beginIndex,finalIndex)); beginIndex = finalIndex; finalIndex = finalIndex + amount >= size ?

size: finalIndex + amount;

Thursday, December 6, 12

Page 34: Facilitando a Programação concorrente com o Fork/Join

while (true) { threads.add(createANewThread(sales, jsons, beginIndex,finalIndex)); beginIndex = finalIndex; finalIndex = finalIndex + amount >= size ?

size: finalIndex + amount;

}

Thursday, December 6, 12

Page 35: Facilitando a Programação concorrente com o Fork/Join

while (true) { threads.add(createANewThread(sales, jsons, beginIndex,finalIndex)); beginIndex = finalIndex; finalIndex = finalIndex + amount >= size ?

size: finalIndex + amount;

if (beginIndex == size) { break; }}

Thursday, December 6, 12

Page 36: Facilitando a Programação concorrente com o Fork/Join

protected List<String> convertToJson(List<Sale> sales){...

while (true) { threads.add(createANewThread(sales, jsons, beginIndex,finalIndex)); beginIndex = finalIndex; finalIndex = finalIndex + amount >= size ?

size: finalIndex + amount;

if (beginIndex == size) { break; }}

}

Thursday, December 6, 12

Page 37: Facilitando a Programação concorrente com o Fork/Join

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

Page 38: Facilitando a Programação concorrente com o Fork/Join

protected List<String> convertToJson(List<Sale> sales){

... for (Thread thread : threads) { thread.start(); }

return jsons;

}

Thursday, December 6, 12

Page 39: Facilitando a Programação concorrente com o Fork/Join

protected List<String> convertToJson(List<Sale> sales){

... for (Thread thread : threads) { thread.start(); }

for (Thread thread : threads) { thread.join(); }

return jsons;

}

Thursday, December 6, 12

Page 40: Facilitando a Programação concorrente com o Fork/Join

@Override protected List<String> convertToJson(List<Sale> vendas) throws Exception {

System.out.println("Convert to json....");

int size = vendas.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) { threads.add(createANewThread(vendas, jsons, beginIndex, finalIndex)); beginIndex = finalIndex; finalIndex = finalIndex + amount >= size ? size: finalIndex + amount;

if (beginIndex == size) { break; } }

for (Thread thread : threads) { thread.start(); }

for (Thread thread : threads) { thread.join(); }

System.out.println("Finished!\n"); return jsons;

}Thursday, December 6, 12

Page 41: Facilitando a Programação concorrente com o Fork/Join

TEMPO

Método Tempo Médio (ms)

Single 5562

Multi Thread 3739

Thursday, December 6, 12

Page 42: Facilitando a Programação concorrente com o Fork/Join

COMPARATIVO

0

2000

4000

6000

Tempo

37395562

Single Multi Thread

Thursday, December 6, 12

Page 43: Facilitando a Programação concorrente com o Fork/Join

DIFICULDADES

Thursday, December 6, 12

Page 44: Facilitando a Programação concorrente com o Fork/Join

DIFICULDADES

•Decidir a quantidade de Threads

Thursday, December 6, 12

Page 45: Facilitando a Programação concorrente com o Fork/Join

DIFICULDADES

•Decidir a quantidade de Threads

•Dividir o trabalho

Thursday, December 6, 12

Page 46: Facilitando a Programação concorrente com o Fork/Join

DIFICULDADES

•Decidir a quantidade de Threads

•Dividir o trabalho

• Juntar tudo no final

Thursday, December 6, 12

Page 47: Facilitando a Programação concorrente com o Fork/Join

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

Page 48: Facilitando a Programação concorrente com o Fork/Join

FORK / JOIN

Thursday, December 6, 12

Page 49: Facilitando a Programação concorrente com o Fork/Join

FORK / JOIN

• Java 7

Thursday, December 6, 12

Page 50: Facilitando a Programação concorrente com o Fork/Join

FORK / JOIN

• Java 7

•Dividir tarefas entre múltiplos processadores

Thursday, December 6, 12

Page 51: Facilitando a Programação concorrente com o Fork/Join

FORK / JOIN

• Java 7

•Dividir tarefas entre múltiplos processadores

• Tarefas que podem ser quebradas recursivamente

Thursday, December 6, 12

Page 52: Facilitando a Programação concorrente com o Fork/Join

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 } }}

COMO FUNCIONA

Thursday, December 6, 12

Page 53: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

Thursday, December 6, 12

Page 54: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

Thursday, December 6, 12

Page 55: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

Thursday, December 6, 12

Page 56: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

Thursday, December 6, 12

Page 57: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork()

Thursday, December 6, 12

Page 58: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

Thursday, December 6, 12

Page 59: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

Thursday, December 6, 12

Page 60: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

Thursday, December 6, 12

Page 61: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

Thursday, December 6, 12

Page 62: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

Thursday, December 6, 12

Page 63: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

Thursday, December 6, 12

Page 64: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

Thursday, December 6, 12

Page 65: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

join()

Thursday, December 6, 12

Page 66: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

join() join()

Thursday, December 6, 12

Page 67: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork() fork()

join() join()

Thursday, December 6, 12

Page 68: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork()

join()

fork()

join() join()

Thursday, December 6, 12

Page 69: Facilitando a Programação concorrente com o Fork/Join

COMO FUNCIONA

fork()

join()

fork()

join()

join() join()

Thursday, December 6, 12

Page 70: Facilitando a Programação concorrente com o Fork/Join

IMPLEMENTANDOpublic class JsonTask extends RecursiveTask<List<String>>{

private final int THRESHOLD = 10000; private List<Sale> list; //constructor...

@Override protected List<String> compute() { }}

Thursday, December 6, 12

Page 71: Facilitando a Programação concorrente com o Fork/Join

IMPLEMENTANDOpublic class JsonTask extends RecursiveTask<List<String>>{

private final int THRESHOLD = 10000; private List<Sale> list; //constructor...

@Override protected List<String> compute() { }}

Thursday, December 6, 12

Page 72: Facilitando a Programação concorrente com o Fork/Join

IMPLEMENTANDOpublic class JsonTask extends RecursiveTask<List<String>>{

private final int THRESHOLD = 10000; private List<Sale> list; //constructor...

@Override protected List<String> compute() { }}

Thursday, December 6, 12

Page 73: Facilitando a Programação concorrente com o Fork/Join

IMPLEMENTANDOpublic class JsonTask extends RecursiveTask<List<String>>{

private final int THRESHOLD = 10000; private List<Sale> list; //constructor...

@Override protected List<String> compute() { }}

Thursday, December 6, 12

Page 74: Facilitando a Programação concorrente com o Fork/Join

@Overrideprotected List<String> compute() { List<String> jsons = new ArrayList<>(); int size = list.size(); if ( size < THRESHOLD){ jsons.addAll(new JsonMapper().toJson(list)); }else{ ... } return jsons;}

Thursday, December 6, 12

Page 75: Facilitando a Programação concorrente com o Fork/Join

}else{

}

Thursday, December 6, 12

Page 76: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask left = new JsonTask(list.subList(0, size / 2));

}

Thursday, December 6, 12

Page 77: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask left = new JsonTask(list.subList(0, size / 2)); JsonTask right = new JsonTask(list.subList(size / 2, size));

}

Thursday, December 6, 12

Page 78: Facilitando a Programação concorrente com o Fork/Join

}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

Page 79: Facilitando a Programação concorrente com o Fork/Join

}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

Page 80: Facilitando a Programação concorrente com o Fork/Join

}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

Page 81: Facilitando a Programação concorrente com o Fork/Join

P

Thursday, December 6, 12

Page 82: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

fork()

Thursday, December 6, 12

Page 83: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

join()

R

fork()

join()

Thursday, December 6, 12

Page 84: Facilitando a Programação concorrente com o Fork/Join

}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

Page 85: Facilitando a Programação concorrente com o Fork/Join

P

Poolde Threads

Thursday, December 6, 12

Page 86: Facilitando a Programação concorrente com o Fork/Join

P

Poolde Threads P

Thursday, December 6, 12

Page 87: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

fork()

Poolde Threads P

Thursday, December 6, 12

Page 88: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

fork()

Poolde Threads P L R

Thursday, December 6, 12

Page 89: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask jsonTaskLeft = new JsonTask(list.subList(0, size / 2)); JsonTask jsonTaskRight = new JsonTask(list.subList(size / 2, size)); jsonTaskLeft.fork(); jsonTaskRight.fork();

jsons.addAll(jsonTaskRight.join()); jsons.addAll(jsonTaskLeft.join());}

Thursday, December 6, 12

Page 90: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

fork()

Poolde Threads P L R

Thursday, December 6, 12

Page 91: Facilitando a Programação concorrente com o Fork/Join

RECURSO OCIOSO

Thursday, December 6, 12

Page 92: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask jsonTaskLeft = new JsonTask(list.subList(0, size / 2)); JsonTask jsonTaskRight = new JsonTask(list.subList(size / 2, size)); jsonTaskLeft.fork(); jsonTaskRight.fork();

jsons.addAll(jsonTaskRight.join()); jsons.addAll(jsonTaskLeft.join());}

Thursday, December 6, 12

Page 93: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask jsonTaskLeft = new JsonTask(list.subList(0, size / 2)); JsonTask jsonTaskRight = new JsonTask(list.subList(size / 2, size)); jsonTaskLeft.fork(); jsonTaskRight.fork();

jsons.addAll(jsonTaskRight.join()); jsons.addAll(jsonTaskLeft.join());}

Thursday, December 6, 12

Page 94: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask jsonTaskLeft = new JsonTask(list.subList(0, size / 2)); JsonTask jsonTaskRight = new JsonTask(list.subList(size / 2, size)); jsonTaskLeft.fork();

jsons.addAll(jsonTaskRight.join()); jsons.addAll(jsonTaskLeft.join());}

Thursday, December 6, 12

Page 95: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask jsonTaskLeft = new JsonTask(list.subList(0, size / 2)); JsonTask jsonTaskRight = new JsonTask(list.subList(size / 2, size)); jsonTaskLeft.fork();

jsons.addAll(jsonTaskRight.compute()); jsons.addAll(jsonTaskLeft.join());}

Thursday, December 6, 12

Page 96: Facilitando a Programação concorrente com o Fork/Join

P

Poolde Threads

L R

P

Thursday, December 6, 12

Page 97: Facilitando a Programação concorrente com o Fork/Join

P

L R

Poolde Threads

LL

P

Thursday, December 6, 12

Page 98: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads

LL

P

Thursday, December 6, 12

Page 99: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads

L

P

L

Thursday, December 6, 12

Page 100: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads

L

P L

Thursday, December 6, 12

Page 101: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads

R

LP

Thursday, December 6, 12

Page 102: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

compute()

Poolde Threads

R

LP

Thursday, December 6, 12

Page 103: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

compute()

Poolde Threads R L

Thursday, December 6, 12

Page 104: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads

compute()

LR

P

Thursday, December 6, 12

Page 105: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads

compute()

return

LR

P

Thursday, December 6, 12

Page 106: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads

compute()

return

LP

Thursday, December 6, 12

Page 107: Facilitando a Programação concorrente com o Fork/Join

}else{ JsonTask jsonTaskLeft = new JsonTask(list.subList(0, size / 2)); JsonTask jsonTaskRight = new JsonTask(list.subList(size / 2, size)); jsonTaskLeft.fork();

jsons.addAll(jsonTaskRight.compute()); jsons.addAll(jsonTaskLeft.join());}

Thursday, December 6, 12

Page 108: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads P L

compute()

return

Thursday, December 6, 12

Page 109: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads P L

compute()

returnjoin()

Thursday, December 6, 12

Page 110: Facilitando a Programação concorrente com o Fork/Join

P

L

fork()

R

Poolde Threads P

compute()

returnjoin()

Thursday, December 6, 12

Page 111: Facilitando a Programação concorrente com o Fork/Join

EXECUTANDO public class JsonForkJoinConverter {protected List<String> convertToJson(List<Sale> sales){

ForkJoinPool forkJoinPool = new ForkJoinPool(); return forkJoinPool.invoke(new JsonTask(sales)); }}

Thursday, December 6, 12

Page 112: Facilitando a Programação concorrente com o Fork/Join

TEMPO

MétodoTempo

Médio (ms)

Single 5562

Multi Thread 3739

Fork/Join 3461

Thursday, December 6, 12

Page 113: Facilitando a Programação concorrente com o Fork/Join

COMPARATIVO

0

2000

4000

6000

Tempo

346137395562

Single Multi Thread Fork/join

Thursday, December 6, 12

Page 114: Facilitando a Programação concorrente com o Fork/Join

@Override protected List<String> compute() { List<String> jsons = new ArrayList<>(); int size = list.size(); if ( size < THRESHOLD){ jsons.addAll(new JsonMapper().toJson(list)); } else{ JsonTask jsonTaskFirst = new JsonTask(list.subList(0, size / 2)); jsonTaskFirst.fork(); JsonTask jsonTaskSecond = new JsonTask(list.subList(size / 2, size)); jsons.addAll(jsonTaskSecond.compute()); jsons.addAll(jsonTaskFirst.join()); } return jsons; }

Thursday, December 6, 12

Page 115: Facilitando a Programação concorrente com o Fork/Join

PROBLEMS?

Thursday, December 6, 12

Page 116: Facilitando a Programação concorrente com o Fork/Join

PROBLEMS?

Thursday, December 6, 12

Page 117: Facilitando a Programação concorrente com o Fork/Join

A ORDEM DAS CHAMADAS

•Ordem das chamadas é importante.

• Perde todo o paralelismo

Thursday, December 6, 12

Page 118: Facilitando a Programação concorrente com o Fork/Join

left.fork();long rightAns = right.compute();long leftAns = left.join();return leftAns + rightAns;

P

P

L R

Thursday, December 6, 12

Page 119: Facilitando a Programação concorrente com o Fork/Join

left.fork();long rightAns = right.compute();long leftAns = left.join();return leftAns + rightAns;

P

P

L R

fork()

L

Thursday, December 6, 12

Page 120: Facilitando a Programação concorrente com o Fork/Join

left.fork();long rightAns = right.compute();long leftAns = left.join();return leftAns + rightAns;

P

R

L R

fork()

L

compute()

Thursday, December 6, 12

Page 121: Facilitando a Programação concorrente com o Fork/Join

left.fork();long rightAns = right.compute();long leftAns = left.join();return leftAns + rightAns;

P

P

L R

fork()

L

compute()

return

Thursday, December 6, 12

Page 122: Facilitando a Programação concorrente com o Fork/Join

left.fork();long rightAns = right.compute();long leftAns = left.join();return leftAns + rightAns;

P

P

L R

fork() compute()

returnjoin()

Thursday, December 6, 12

Page 123: Facilitando a Programação concorrente com o Fork/Join

left.fork();

return leftAns + rightAns;

long rightAns = right.compute();long leftAns = left.join();

Thursday, December 6, 12

Page 124: Facilitando a Programação concorrente com o Fork/Join

left.fork();

return leftAns + rightAns;long rightAns = right.compute();long leftAns = left.join();

Thursday, December 6, 12

Page 125: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

left.fork();long leftAns = left.join();long rightAns = right.compute();return leftAns + rightAns;

Thursday, December 6, 12

Page 126: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

fork()

L

left.fork();long leftAns = left.join();long rightAns = right.compute();return leftAns + rightAns;

Thursday, December 6, 12

Page 127: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

fork()

L

left.fork();long leftAns = left.join();long rightAns = right.compute();return leftAns + rightAns;

Bloqueia a thread!

Thursday, December 6, 12

Page 128: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

fork()

L

left.fork();long leftAns = left.join();long rightAns = right.compute();return leftAns + rightAns;

join()

Thursday, December 6, 12

Page 129: Facilitando a Programação concorrente com o Fork/Join

P

R

L R

fork()

left.fork();long leftAns = left.join();long rightAns = right.compute();return leftAns + rightAns;

join()

compute()

Thursday, December 6, 12

Page 130: Facilitando a Programação concorrente com o Fork/Join

P

R

L R

fork() compute()

return

left.fork();long leftAns = left.join();long rightAns = right.compute();return leftAns + rightAns;

join()

Thursday, December 6, 12

Page 131: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

fork() compute()

returnjoin()

left.fork();long leftAns = left.join();long rightAns = right.compute();return leftAns + rightAns;

Thursday, December 6, 12

Page 132: Facilitando a Programação concorrente com o Fork/Join

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

Thursday, December 6, 12

Page 133: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

Thursday, December 6, 12

Page 134: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

compute()

Thursday, December 6, 12

Page 135: Facilitando a Programação concorrente com o Fork/Join

P

R

L R

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

compute()

Thursday, December 6, 12

Page 136: Facilitando a Programação concorrente com o Fork/Join

P

R

L R

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

compute()

return

Thursday, December 6, 12

Page 137: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

compute()

return

Thursday, December 6, 12

Page 138: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

compute()

return

fork()

L

Thursday, December 6, 12

Page 139: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

compute()

return

fork()

L

Thursday, December 6, 12

Page 140: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

fork() compute()

returnjoin()

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

Thursday, December 6, 12

Page 141: Facilitando a Programação concorrente com o Fork/Join

P

P

L R

fork() compute()

returnjoin()

long rightAns = right.compute();left.fork();long leftAns = left.join();return leftAns + rightAns;

Executa Sequencialmente

Thursday, December 6, 12

Page 142: Facilitando a Programação concorrente com o Fork/Join

left.fork();long rightAns = right.compute();long leftAns = left.join();return leftAns + rightAns;

Thursday, December 6, 12

Page 144: Facilitando a Programação concorrente com o Fork/Join

OBRIGADO!

github.com/mariofts

@mario_fts

[email protected]

Thursday, December 6, 12