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.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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!