ThreadsFundiuTicoETecoException  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
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)???
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.
[WWW]
#@®®¡$
Moderador
[Avatar]

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.
[WWW] [ICQ]
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.
[WWW]
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!
#@®®¡$
Moderador
[Avatar]

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.
[WWW] [ICQ]
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?
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.
[WWW]
#@®®¡$
Moderador
[Avatar]

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.
[WWW] [ICQ]
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!
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team