Como fazer para que 10 threads trabalhem em paralelo pegando elementos diferentes de um set e processando-os. Exemplo a Thread 1 pega o elemento 1 do set, a Thread 2 o elemento 2, ... assim que uma terminar pega o próximo elemento do Set.
Como fazer para que 10 threads trabalhem em paralelo pegando elementos diferentes de um set e processando-os. Exemplo a Thread 1 pega o elemento 1 do set, a Thread 2 o elemento 2, ... assim que uma terminar pega o próximo elemento do Set.
Boa noite, Carlos! Como vai?
A ideia é que vc terá que sincronizar o acesso ao seu Set
, mais especificamente ao contador que indica qual a próxima posição a ser acessada!
Mas, como a ideia é não recriar a roda, te indico dar uma olhada em toda a aula 4 do curso de Threads em Java aqui da Alura que trata justamente sobre esse assunto!
Vc vai pegar a ideia do que precisa ser feito! Daí se te restar alguma dúvida vc pode lançar a dúvida específica aqui no fórum!
Grande abraço e bons estudos!
Mas problema é que assim estou criando o numero de Threads que meu set inicial tiver de elementos. Não consegui pensar em uma maneira que a Thread receba um novo elemento para processar quando acabar um elemento.
Ora, mas o que a aula do link que te passei mostra é exatamente isso! No entanto, em vez de pegar algo as threads colocam algo na lista. O processo inverso é semelhante ao visto em aula!
Será algo do tipo:
public class Monitor {
private List<String> lista = // Cria uma lista de forma thread-safe como visto durante a aula 4 a partir do seu Set. Como vc sempre vai querer pegar o próximo item da lista, é melhor trabalhar com uma List em vez de um Set.
public String pegaProximoItem() {
synchronized(this) {
if (posicao < lista.size()) {
String item = lista.get(posicao);
posicao++;
return item;
}
throw new RuntimeException("Não há mais itens a serem processados!");
}
}
}
Todas as suas threads consumirão a sua lista a partir de uma instância da classe Monitor
, que vai gerenciar o acesso à sua lista e, por isso, implementa o importante conceito de monitor dentro da área de concorrência.
Pegou a ideia?
Sim. Obrigado. Acabei indo por um lado que ficou bem maior mas em uma próxima atualização ja vou testar dessa forma.
Blz, Carlos! Sempre que tiver qualquer dúvida é só mandar pro pessoal aqui no fórum!
Grande abraço e bons estudos!