| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 08:29:32
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Caraca dei tilte numa parada sobre threads. Olhem esse código:
Minha dúvida cruel é: quando eu começo as duas threads, e os zeros e uns não saem contínuos na tela, o que acontece?
A) A JVM fica alternando a execução das threads, como se fosse um "yield() involuntário"
C) As duas threads rodam "ao mesmo tempo" e a saída é resultado da "reação" do System.out (Console) às threads...
C) Ambas as respostas
D) Tá maluco rapá!
???????????????????????????????????????????
Outra dúvida: existe alguma objeção em eu sincronizar o Runnable.run(), ou isso não tem o menor sentido (estou em estado de tilte heheh)???
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 10:08:21
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Quando você tem apenas um processador em sua máquina, e você está usando um sistema operacional que suporta threads nativamente (Windows, Solaris, Linux, AIX etc.) então o que ocorre é que o sistema operacional chaveia entre as threads em várias situações, entre as quais:
- Quando o programa chama uma API do sistema operacional ("system call"), como é o caso de escrever algo no console. (A escrita em console é bufferizada parcialmente pelo sistema operacional e pelo Java, portanto é que você viu que não aparecem seqüências 010101010101 e sim 00000111111000000).
- Quando transcorreu uma determinada fatia de tempo (time slice) e o sistema operacional julgar que é necessário transferir o controle a outra thread ou processo.
- Os algoritmos para essa transferência de controle são um pouco complexos (embora ocupem normalmente só algumas centenas de linhas de código) e normalmente levam em conta prioridades de threads, de processos, se a thread solicitou uma chamada a API que "bloqueia" esperando, por exemplo, por uma leitura de disco ou de teclado etc.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 10:23:56
|
#@®®¡$
Moderador
![[Avatar]](/images/avatar/2288f691b58edecadcc9a8691762b4fd.jpg)
Membro desde: 13/02/2004 09:42:28
Mensagens: 807
Localização: São Paulo
Offline
|
renato3110 wrote:Outra dúvida: existe alguma objeção em eu sincronizar o Runnable.run(), ou isso não tem o menor sentido (estou em estado de tilte heheh)???
Não, não faz muito sentido. O run() normalmente só é chamado por uma thread para aquele objeto, então o lock não vai adiantar nada.
|
Wilerson "#@®®¡$" de Oliveira
http://mundoestranho.net/blog/
Douglas Adams wrote:I love deadlines. I like the whooshing sound they make as they fly by.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 10:29:52
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
A dica é: só use "synchronized" se souber muito bem o que está fazendo.
Em 99% dos casos, usar as novas classes de java.util.concurrent resolve seus problemas.
95% do tempo as pessoas usam "synchronized" por magia ou mistificação, ou porque ouviram falar que é bom para alguma coisa.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 10:55:54
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
thingol wrote:...
Então a resposta seria 'A'? Ou seja, o que acontece na verdade é que esse "multithreading" na verdade é uma simples alternância de execução, como se fosse um yield() automático?
#@®®¡$ wrote:
renato3110 wrote:Outra dúvida: existe alguma objeção em eu sincronizar o Runnable.run(), ou isso não tem o menor sentido (estou em estado de tilte heheh)???
Não, não faz muito sentido. O run() normalmente só é chamado por uma thread para aquele objeto, então o lock não vai adiantar nada.
Claro!!! O código que chama o run() não é multi-threaded a não ser que eu thredeie!!!! Destravou!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 11:00:42
|
#@®®¡$
Moderador
![[Avatar]](/images/avatar/2288f691b58edecadcc9a8691762b4fd.jpg)
Membro desde: 13/02/2004 09:42:28
Mensagens: 807
Localização: São Paulo
Offline
|
renato3110 wrote:
thingol wrote:...
Então a resposta seria 'A'? Ou seja, o que acontece na verdade é que esse "multithreading" na verdade é uma simples alternância de execução, como se fosse um yield() automático?
Depende. Se você tiver mais de um processador, pode ser a B também.
renato3110 wrote:
#@®®¡$ wrote:
renato3110 wrote:Outra dúvida: existe alguma objeção em eu sincronizar o Runnable.run(), ou isso não tem o menor sentido (estou em estado de tilte heheh)???
Não, não faz muito sentido. O run() normalmente só é chamado por uma thread para aquele objeto, então o lock não vai adiantar nada.
Claro!!! O código que chama o run() não é multi-threaded a não ser que eu thredeie!!!! Destravou! 
Eu threadeio, tu threadeias, ele threadeia, nós threadeamos, vós threadeais, eles threadeiam.
Agora fale tudo isso comendo farinha.
Edit: Ah sim, o run() é chamado pelo start() da thread, em sã consciência você não o chama diretamente.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 12:19:32
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
thingol wrote:A dica é: só use "synchronized" se souber muito bem o que está fazendo.
Em 99% dos casos, usar as novas classes de java.util.concurrent resolve seus problemas.
95% do tempo as pessoas usam "synchronized" por magia ou mistificação, ou porque ouviram falar que é bom para alguma coisa.
Já tentei ler sobre concurrent mas é sinistro, pô tem um lance de uns wrappers de primitivos, uns métodos pra substituir operadores, <prepotente>achei escroto...</prepotente>
Sobre synchronized realmente é meio enigmático pra mim quando usar ou não, mas pelo menos é bom saber que se eu estiver em dúvida, provavelmente não preciso disso...
#@®®¡$ wrote:Eu threadeio, tu threadeias, ele threadeia, nós threadeamos, vós threadeais, eles threadeiam.
Agora fale tudo isso comendo farinha. 
Já tô rindo só de imaginar como é kkkkkkkkkkkkkkkk
#@®®¡$ wrote:Edit: Ah sim, o run() é chamado pelo start() da thread, em sã consciência você não o chama isoladamente.
Uêeeeeeeepa! Isoladamente como assim?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 13:34:39
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
renato3110 wrote:
Já tentei ler sobre concurrent mas é sinistro, pô tem um lance de uns wrappers de primitivos, uns métodos pra substituir operadores, <prepotente>achei escroto...</prepotente>
Leia a palestra do Sun Tech Days -
Untangling the Threads: Java Concurrency and Synchronization Utilities
- você vai ver que fazer um servidor que recebe mensagens via sockets, com um pool de threads (um problema que não é trivial), é ridiculamente fácil com essas novas classes.
Se explicarem bem pra você vai ver que 95% dos problemas (mesmo os mais complicados) se resolvem com essas classes.
Os javadocs dessas classes são imensos, mas têm um monte de exemplos (que normalmente não existem nos javadocs das outras classes do java) e as classes são grandes porque o sr. Doug Lea, que escreveu praticamente sozinho o pacote, pensou em TUDO.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 13:34:52
|
#@®®¡$
Moderador
![[Avatar]](/images/avatar/2288f691b58edecadcc9a8691762b4fd.jpg)
Membro desde: 13/02/2004 09:42:28
Mensagens: 807
Localização: São Paulo
Offline
|
renato3110 wrote:
#@®®¡$ wrote:Edit: Ah sim, o run() é chamado pelo start() da thread, em sã consciência você não o chama isoladamente.
Uêeeeeeeepa! Isoladamente como assim?
Eu disse "isoladamente"? Ih, foi mal, foi um daqueles momentos em que eu quero falar uma palavra e falo outra. Eu deveria ter dito "diretamente", tanto que editei meu post e corrigi.
O run() existe para cumprir o contrato que Runnable propõe, que é a de rodar em uma thread separada, por isso você não chama o método diretamente.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/04/2006 16:04:48
|
renatosilva
GUJ Master
Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline
|
Isso eu sei Valeu galera vou olhar o link do thingol, obrigado!
|
|
|
 |
|
|