Estou com uma dúvida em relação a Threads… Quando eu devo usar e onde?
Exemplo: Eu tenho uma aplicação multiusuário, coloco a thread no método main chamando o método de início da aplicação? Daí cada novo usuário é uma nova thread? ou tenho que ir pulverizando o uso de threads dentro da aplicação?
[quote=Iceguy]Estou com uma dúvida em relação a Threads… Quando eu devo usar e onde?
Exemplo: Eu tenho uma aplicação multiusuário, coloco a thread no método main chamando o método de início da aplicação? Daí cada novo usuário é uma nova thread? ou tenho que ir pulverizando o uso de threads dentro da aplicação?[/quote]
pera ai… sua aplicação seria desktop? ficou meio dificil de entender, ao menos para mim o que você escreveu…
threads são usadas para fazer com que o software tenha multiplos processamentos simultâneos, ou seja, que ele faça duas coisas ao mesmo tempo, se o seu software precisa fazer duas ou mais coisas ao mesmo tempo então você precisará de mais de uma thread (quaisquer coisas, tocar uma musica enquanto o software executa por exemplo ja é um candidato, fazer algum processamento enquanto carrega uma barra de status também.).
em uma aplicação desktop não vejo muito sentido no que você disse por quê dificilmente você vai ter dois usuários usando o software em uma mesma máquina, se sua aplicação for web por exemplo e você quer vários usuário simultâneos (o que é normal) então o seu servidor ja gerencia isso para você (e neste caso é indicado não se mecher com threads…).
Quando estiver desenvolvendo para desktop posso ver alguns pontos que seja legal o uso de thread.
Imagine que tenha um capo calculado ou que tenha alguma verificação que roda após o campo perder o foco, se o tempo que isso leva for grande a pessoal que tiver usando o sistema, não pode continuar a suar o mesmo ate que todo o processamento seja concluído, usando thread este processamento poderia ser realizado em “Paralelo” com a digitação dos outros campos do formulário.
Outro uso é quando o processamento vai demorar muito, por exemplo imagine que você tenha um sistema que faz parser de um arquivo, e você quer dar a opção da pessoa após pedir para processar, cancelar o parser ou pausar, para fazer isso você deve usar Thread.
Só toma cuidado quando for usar, no primeiro caso por exemplo como a verificação estaria rodando em paralelo você deve controlar uso do botão “cadastrar” para garantir que a verificação/calculo finalizou para não acabar salvando dados incorretos em sua aplicação.
Na verdade não estou desenvolvendo nada, estou começando a estudar Java, e essa dúvida ta martelando.
Quero saber se meu conceito está correto.
Em um jogo de pong multiplayer, cada jogador que se conecta ao servidor cria uma nova thread, e quando ele desloga essa thread morre. Isso está correto?
Em uma aplicação Desktop que gera um relatório complexo, hora que o usuário clica em “Gerar” eu abro uma thread pro gerador e o usuário continua usando o sistema, e quando concluir a geração a thread gerar morre. Esta correto esse pensamento?
A dúvida é em que parte do código chamar essa thread
Esta começando com thread, tente o “Olá mundo das thread” implementa o problema do produtor,consumidor!
Em um jogo de pong eu não sei, este eu não conheço, mas imaginando um jogo foobar multiplayer, abriria uma thread para cada usuário, quando ele conectar! enquanto ele estiver jogando ele vai estar na mesma thread e morre quando ele desconetar.
Em uma aplicação desktop, neste caso você vai iniciar a thread no evento do botão “Gerar”
Quando vc quiser executar algo em paralelo na solução. Trocando as palavras, seria quando o usuário necessitar executar coisas simultâneas no seu sistema.
Vc ja usou o MS word? Vc é obrigado esperar o word imprimir 1 mil paginas na impressora para vc pode alterar algum texto no documento? Claro que não…Por que? Por que o word executa a impressão do documento numa thread separada, liberando o usuário para continuar usando o sistema.
OBS - não é para ficar fazendo tudo em thread separadas que pode abrir anomalias na sua solução. Na verdade vc tem levantas nos requisitos tudo que o usuário não teria que esperar o sistema fazer, para continuar fazendo outras coisas simultâneas…
olha, muita genta aparentemente apenas consegue observar o seu uso no caso do usuário continuar as suas “tarefas” sem precisar ficar esperando.
Eu uso muito threads quando preciso fazer processamentos pesados, pois normalmente os usuários tem mais do que 1 núcleo no pc, e cada thread pode apenas usar o total de 1 nuclueo…
Quando são relatórios muito grandes, acredito que seja melhor criar laços pra cada diferente thread, ganhando enormemente muita performe e agilidade. Pena que pra implementar isso não seja algo tão simples assim.
e FernandoFranzini, o link que vc postou, não existe mais.
Não é qualquer coisa que você pode enfiar com thread no processador que vai rodar mais rápido, precisa de dados paralelizáveis (existe essa palavra? hehehe). Cálculo pesado e que é possível rodar em paralelo são operações matriciais, muito usado em gráficos.
Tem até o CUDA que vc programa em C++ pra usar a VGA (No caso o CUDA é da NVidia) pra processar dados paralelos, o ganho em desempenho é fantástico.
E outra, o processador tem implementado dentro dele código para dividir o processamento, sua aplicação não fica rodando só em um núcleo se você não implementar Threads no seu cálculo.
não discordo de nada, de fato vc nao vai criar uma thread pra cada check de uma posição de um array/vetor
Mas essas implementações de dividir o processamento, eu ainda não vi funcionar em nenhum lugar.
Experimenta criar um laço pra torrar o processamento, em todos os cpus que eu tenho testado, os unicos ainda que chegaram no 100% de processamento, foram aqueles singlecore. Os demais ficaram apenas processando num unico núcleo ainda…
Mas eu reparei que quando se tem muitas coisas sendo processados em 2+ núcleos, e começa a usar muito processamento numa especifica thread, ele aloca essas outras threads em outros núcleos, e tenta isolar aquela thread no núcleo… (acho)
Mas enfim, no futuro, quando a programação nas nuvens for muito comum, terá que adotar novas tecnologias no java pra processamento de dados direto em multithreads, assim como umas novas linguagens estão adotando.
(acho que falei muita merda :D)
[quote=ArrancaToco]não discordo de nada, de fato vc nao vai criar uma thread pra cada check de uma posição de um array/vetor
Mas essas implementações de dividir o processamento, eu ainda não vi funcionar em nenhum lugar.
Experimenta criar um laço pra torrar o processamento, em todos os cpus que eu tenho testado, os unicos ainda que chegaram no 100% de processamento, foram aqueles singlecore. Os demais ficaram apenas processando num unico núcleo ainda…
Mas eu reparei que quando se tem muitas coisas sendo processados em 2+ núcleos, e começa a usar muito processamento numa especifica thread, ele aloca essas outras threads em outros núcleos, e tenta isolar aquela thread no núcleo… (acho)
Mas enfim, no futuro, quando a programação nas nuvens for muito comum, terá que adotar novas tecnologias no java pra processamento de dados direto em multithreads, assim como umas novas linguagens estão adotando.
(acho que falei muita merda :D)[/quote]
Realmente até o Java 6, todas as thread rodavam single-core mesmo…mas a partir do Java 7 tem o Fork/Join feito exclusivamente para isso http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html